还不存在的类–即我们需要使用反射来使用的类

Person类:

package com.qf.demo4;

public class Person {

    private String name;
public int age;
static int weight;
int male;
protected int num; public Person(String name, int age, int weight) {
this.name = name;
this.age = age;
this.weight = weight;
System.out.println("有参数的构造方法");
} public Person() {
System.out.println("无参数的构造方法");
} public void eat() {
System.out.println("吃");
} public void drink(String type) {
System.out.println("喝" + type);
} public String sleep() {
System.out.println("睡");
return "呵呵";
} private void play() {
System.out.println("玩");
} public static void hehe() {
System.out.println("heheheheh");
} @Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ",weight = "+weight+"]";
}
}

演示代码:


Test1:创建Class对象

package com.qf.demo4;

import com.qf.demo.Person;
/**
* 每一个类只有一个class 对象
* com.qf.demo.Person 包名+类名 全限定名
* @author Administrator
*
*/
public class Test { public static void main(String[] args) {
// 创建Class 对象
// 第一种方式:类.class
Class class1 = Person.class;
System.out.println(class1.hashCode());
// 第二种方式:创建类的对象;然后--对象.getClass()
Person person = new Person();
Class class2 = person.getClass();
System.out.println(class2.hashCode()); // 第三种方式:使用forname方法,参数为相对于本工程的地址
try {
Class class3 = Class.forName("com.qf.demo.Person");
System.out.println(class3.hashCode());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

Test2:创建Constructor对象,并创建Person类(还没有的类)对象

package com.qf.demo4;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException; public class Test2 { public static void main(String[] args) { try {
Class class1 = Class.forName("com.qf.demo4.Person");
Constructor[] constructors = class1.getConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
} // 1 通过构造方法创建 Perosn对象
Constructor constructor = class1.getConstructor(null);// 得到无参的构造方法
Person person = (Person) constructor.newInstance(null);
System.out.println(person); // 2 利用有参数的构造方法创建对象
Constructor constructor2 = class1.getConstructor(String.class,int.class,int.class);
Person person2 = (Person) constructor2.newInstance("张三",5,9);
System.out.println(person2);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

Test3:获取方法,以及调用方法

package com.qf.demo4;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; public class Test3 { public static void main(String[] args) {
try {
Class class1 = Class.forName("com.qf.demo4.Person");
// 得到构造方法
Constructor constructor = class1.getConstructor(null);
Object object = constructor.newInstance(null); Method[] methods = class1.getMethods();// 得到本类和父类的非私有的方法 Method[] methods2 = class1.getDeclaredMethods();// 得到本类中声明的所有的方法(包括私有) // 得到 无参 无返回值的 方法并且调用
Method method = class1.getMethod("eat", null);
// 调用方法的对象 实际参数
method.invoke(object, null);// 是哪个方法被调用 // 调用 有参数 无返回值的方法
Method method2 = class1.getMethod("drink", String.class);
method2.invoke(object, "水"); // 有返回值的
Method method3 = class1.getMethod("sleep", null);
Object object2 = method3.invoke(object, null);// invoke方法的返回值就是调用的方法的返回值
System.out.println(object2); // 得到静态的方法
Method method4 = class1.getMethod("hehe", null);
method4.invoke(null, null);// 静态方法不需要传递对象 直接写null // 私有的 私有的方法 必须用 getDeclaredMethod 才能得到
Method method5 = class1.getDeclaredMethod("play", null);
method5.setAccessible(true);// 私有方法默认没有权限调用,必须单独设定调用权限
method5.invoke(object, null); } catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

反射定义:http://blog.csdn.net/baidu_37107022/article/details/71234940

Java之反射代码演示说明的更多相关文章

  1. 如何利用缓存机制实现JAVA类反射性能提升30倍

    一次性能提高30倍的JAVA类反射性能优化实践 文章来源:宜信技术学院 & 宜信支付结算团队技术分享第4期-支付结算部支付研发团队高级工程师陶红<JAVA类反射技术&优化> ...

  2. java 覆盖hashCode()深入探讨 代码演示样例

    java 翻盖hashCode()深入探讨 代码演示样例 package org.rui.collection2.hashcode; /** * 覆盖hashcode * 设计HashCode时最重要 ...

  3. java 状态模式 解说演示样例代码

    package org.rui.pattern; import junit.framework.*; /** * 为了使同一个方法调用能够产生不同的行为,State 模式在代理(surrogate)的 ...

  4. java注意事项演示 地图产生表 演示样本 来自thinking in java 4 20代码的章

    java注意事项演示 地图产生表 演示样本  来自thinking in java 4 20代码的章 thinking in java 4免费下载:http://download.csdn.net/d ...

  5. DotNet,PHP,Java的数据库连接代码大全(带演示代码)

    C#数据库连接字符串 Web.config文件 <connectionStrings> <!--SQLServer数据库连接--> <add name="con ...

  6. Java用代码演示String类中的以下方法的用法

    用代码演示String类中的以下方法的用法 (1)boolean isEmpty(): 判断字符串是不是空串,如果是空的就返回true (2)char charAt(int index): 返回索引上 ...

  7. Java高新技术 反射机制

     Java高新技术 反射机制 知识概要:                   (1)反射的基石 (2)反射 (3)Constructor类 (4)Field类 (5)Method类 (6)用反射方 ...

  8. Java基础-反射(reflect)技术详解

    Java基础-反射(reflect)技术详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.类加载器 1>.JVM 类加载机制  如下图所示,JVM类加载机制分为五个部分 ...

  9. Java之反射(部分文档摘过来方便以后查看)

    第1章 类加载器 1.1 类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. l 加载 就是指将class文件读入内存,并为之创建 ...

随机推荐

  1. php checkbox 从数据库读取和写入

    checkbox将选中的值写入数据库中,在修改的时候如何从数据库中读取并设定Checkbox的状态 1.写入数据库提交后因为你的rol是数组,所以可以使用$_POST获取 PHP code   ? 1 ...

  2. uoj #58 【WC2013】糖果公园

    题面:http://uoj.ac/problem/58 正解:树上带修改莫队. 首先Orz vfk大神,树上莫队的套路还是很厉害的..http://vfleaking.blog.163.com/blo ...

  3. php生成二维码的几种方式整理及使用实例

    hp生成二维码的方式:1.google开放api:2.php类库PHP QR Code:3.libqrencode:4.QRcode Perl CGI & PHP scripts感兴趣的朋友可 ...

  4. JAVA 继承中的this和super

    学习java时看了不少尚学堂马士兵的视频,还是挺喜欢马士兵的讲课步骤的,二话不说,先做实例,看到的结果才是最实际的,理论神马的全是浮云.只有在实际操作过程中体会理论,在实际操作过程中升华理论才是最关键 ...

  5. Linux centos7下安装配置redis及Redis desktop Manager工具连接注意事项

    基本工具:VMware12.CentOS-7-x86_64-Everything-1611.iso.redis-desktop-manager-0.8.0.3841 废话不多说,首先,关于什么是Red ...

  6. TPshop分销功能的使用与表设计

    首先来段科普,摘自百度百科: 在西方经济学中,分销 的含义是建立销售渠道的意思,根据著名的营销大师菲利普·科特勒的定义,分销渠道(Distribution Channel)又或者叫营销渠道(Marke ...

  7. 利用反射来实现获取成员的指定特性(Attribute)信息

    在开发过程中,我们经常需要自定义一些特性,来辅助我们完成对对象或者枚举进行管理.我们需要知道如何获取对象使用的特性信息. 以下举个学习用的例子. 我们自定义一个特性类,这个特性设置在一个数据段内是否执 ...

  8. 增强for循环 -- foreach循环

    1  作用 简化迭代器的书写格式.(注意:foreach循环的底层还是使用了迭代器遍历.) 2  适用范围 如果是实现了Iterable接口的对象或者是数组对象都可以使用foreach循环. 3  格 ...

  9. Spring BeanFactory源码学习

    一.BeanFactory BeanFactory是Spring IOC容器的基础,是IOC容器的基础接口,所有的容器都是从它这里继承实现而来.BeanFactory提供了最基本的IOC容器的功能,即 ...

  10. Exchanger类详解

    Exchanger并发辅助类,允许在并发任务之间交换数据.具体来说Exchanger类在两个线程之间定义同步点.当两个线程到达同步点时,它们交换数据结构.需要注意的是Exchanger类只能同步两个线 ...