反射应该是比较常用的一个功能,之前对这块只是照样画图,么有系统的学习。现在就让我讲一讲一些原理。
首先,什么是反射?
从网上了解到的,反射就是在运行时候,能通过一些手段得到该对象的所有(注意是所有哦)属性、方法;这种动态获取运行对象的属性和动态调用对象的方法的过程就叫做反射。
为什么要用反射呢?
原理是什么?
其实原理就是java反射机制提供了一些Java Reflection APIs,帮助我们能在运行时候动态获取类的信息并修改,以及动态调用方法。
在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
java反射怎么拿取运行类的属性和方法?
用到的就是Class对象。它是java.lang.Class<T>这个类生成的对象,T参数可以是任意类型。是正在运行的java应用程序的类和接口。枚举是一种类,注释是一种姐, 。每个数组也属于被映射为Class对象的一个类,所以具有相同元素类型和维数的数据都共享该Class对象。基本的java类型和关键字void也表示为Class对象。
获取Class对象有三种方式:
(1) 通过实例变量的getClass()方法。例如:
Class c1 = new String("abc").getClass();
(2) 通过Class类的静态方法——forName()来实现,例如:
Class class =Class.forName(className);
注意:当使用Class.forName()方法时,你必须提供完全限定类名。即类名要包括所有包
名。例如,如果MyObject是位于包com.jenkov.myapp下,那么类的完全限定名称是com.jenkov.myapp.MyObject。如果在运行时类路径上找不到类,Class.forName()方法会抛出一个ClassNotFoundException。
(3) 使用类字面常量或TYPE字段,例如:
Class myObjectClass= MyObject.class;(类字面常量不仅可以应用于普通的类,也可以应用
于接口、数组以及基本数据类型),这种方式不仅更简单,而且更安全,因为它在编译时就会受到检查,并且根除了对forName方法的调用,所以也更高效,建议使用“.class”的形式。
参考:http://blog.csdn.net/coslay/article/details/38084343