Java反射总结

来源:互联网 发布:东莞东莞菲凡网络 编辑:程序博客网 时间:2024/06/02 02:13

能够分析类能力的程序成为反射(reflective),反射机制可以用来:
1. 在运行中分析类的能力
2. 在运行中查看对象
3. 实现通用的数组操作代码
4. 利用Method对象。

一、 Class类

在程序运行期间,Java运行时系统(JRE)始终为所有的对象维护一个被称为运行时的类型标识。这个信息跟踪着每个对象所属的类,虚拟机利用运行时类型信息选择相应的方法执行。
可以通过专门的Java类访问这些信息,保持这些信息的类被称为Class。 ——《Java核心技术 中文第九版 卷一P193》

查看Class的源码可以发现,该类在JDK1.0时就存在了,它还链接到ClassLoader类中。其实一个类在被虚拟机加载到内存时,在线程共享的方法区中就生成了这个类的Class引用。

  1. clazz.getName()方法(实例方法)返回Class对象关联的类的名称,有一些返回的name很奇怪比如:

    • int[].getClass().getName()返回的是[I
    • Double[].getClass().getName()返回的是[Ljava.lang.Double
    • Integer[].getClass().getName()返回的是[Ljava.lang.Integer
    • long[].getClass.getName()返回的是[J;
  2. Class.forName(String)方法(静态方法)返回指定名称(类的全限定名)的类的Class实例;

  3. clazz.newInstance()(实例方法)返回一个Class对象关联的类的实例,实际上是调用类的无参构造器;
  4. clazz.getFields()返回一个包含Field对象的数组,这些对象记录了这个类和其父类的公有域;clazz.getDeclaredFields()返回了该类的所有域,不包括其父类;
  5. clazz.getMethods()返回该类及其父类的所有公有方法;clazz.getDeclaredMethods()返回该类的所有方法;
  6. clazz.getConstructors()返回该类及其父类的所有公有构造器;clazz.getDeclaredConstructors()返回该类的所有构造器;
    7.clazz.getComponentType(),如果clazz是数组的Class对象,返回该数组的类型。

二、Filed、Method、Constructor、Modifier、AccessibleObject、Array等常用类
1. Filed、Method、Constructor常用方法
Class getDeclaringClass():返回关联的Class对象
int getModifiers():返回一个修饰符对于的整型数值,如public=1,private=2
String getName():返回描述名称的字符串
Constructor和Method类:Class[] getParameterTypes():返回用于描述参数类型的Class数组
Method类:Class getReturnType():返回用于描述方法返回类型的Class对象;public Object invoke(Object obj, Object… args):调用方法,第一个参数是method所属的类的实例,第二个参数是method所需的参数列表。
2. Modifier
static String toString(int modifiers):返回modifier对应的修饰符的字符串标识
static boolean isPublic(int modifiers):返回是否为public修饰符
。。。
3. AccessibleObject
void setAccessible(boolean flag):为反射对象设置可访问标识,true表示屏蔽Java语言的访问检查,使得对象的私有属性也可以get和set
boolean isAccessible():返回对象是否可访问标识
static void setAccessible(AccessibleObject[] array,boolean flag):批量设置对象数组可访问标识
4. java.lang.reflect.Array
static int getLength(Object) 获取数组对象的长度;
static Object newInstance(Class

0 0