反射机制允许程序在运行时取得任何一个已知名称的class的内部信息,容许程序在运行时加载、探知、使用编译期间未知的class。即java的反射机制可以加载一个运行时才得知名称的class,获得其完整结构。
(反射就是运行时可以得到某个对象的所有信息,包括方法,类型,属性,方法参数,方法返回值以及可以调用该类的所有方法。)
在程序运行期间,java运行时系统始终为所有对象维护一个被称为运行时的类型标识。
获取类的Class对象的方法:
调用getClass() (Object类中的getClass()方法返回一个Class类型的实例) | Boolean var1 = true;Class<?> classType2 = var1.getClass();System.out.println(classType2);输出:class java.lang.Boolean |
运用T.class 语法 (T是任意的Java类型) | Class<?> classType4 = Boolean.class;System.out.println(classType4);输出:class java.lang.Boolean |
运用static method Class.forName() (使用时应该提供异常处理器) | Class<?> classType5 = Class.forName("java.lang.Boolean");System.out.println(classType5);输出:class java.lang.Boolean |
运用primitive wrapper classes的TYPE 语法 (这里返回的是原生类型,和Boolean.class返回的不同) | Class<?> classType3 = Boolean.TYPE;System.out.println(classType3);输出:boolean |
反射的应用
1:通过反射获取构造方法并使用
//获取字节码文件对象
Class c = Class.forName("cn.itcast.Person");
//获取构造器对象
Constructor con = c.getDeclaredConstructor(String.class,int.class);
//通过构造器对象获取Person对象
Object obj = con.newInstance("刘意",29);
2:通过反射获取成员变量并使用
//获取字节码文件对象
Class c = Class.forName("cn.itcast.Person");
//获取构造器对象
Constructor con = c.getDeclaredConstructor(String.class,int.class);
//通过构造器对象获取Person对象
Object obj = con.newInstance("刘意",29);
//获取成员变量
Field field = c.getDeclaredField("name");
field.setAccessible(true);
field.set(obj,"刘大意");
3:通过反射获取成员方法并使用
//获取字节码文件对象
Class c = Class.forName("cn.itcast.Person");
//获取构造器对象
Constructor con = c.getDeclaredConstructor(String.class,int.class);
//通过构造器对象获取Person对象
Object obj = con.newInstance("刘意",29);
//获取所有公共方法对象,包括从父类继承的
//(获取本类所有方法的时候,不包括从父类继承的)
Method[] methods = c.getDeclaredMethods();
for(Method m : methods){
m.setAccessiable(true);
m.invoke(obj, null);
}