笔记整理:反射

    反射
        反射机制允许程序在运行时取得任何一个已知名称的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 classesTYPE 语法

(这里返回的是原生类型,和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);
}

























posted @ 2015-03-23 23:36  DoIStarry  阅读(105)  评论(0编辑  收藏  举报