现在的位置: 首页 > 综合 > 正文

Java中的反射机制

2018年05月19日 ⁄ 综合 ⁄ 共 1748字 ⁄ 字号 评论关闭

1)概念:
是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。


2)功能:
     在运行时判断任意一个对象所属的类;
     在运行时构造任意一个类的对象;
     在运行时判断任意一个类所具有的成员变量和方法;
     在运行时调用任意一个对象的方法;

     生成动态代理。


3)获得某个对象的具体属性:
Class ownerClass = owner.getClass():得到对象owner的Class。
Field field = ownerClass.getField(fieldName):通过Class得到类声明的属性。
Object property = field.get(owner):通过对象得到该属性的实例,如果这个属性是非公有的,这里会报IllegalAccessException。如果需要访问到对象的private属性,需要首先调用:AccesibleObject.setAccessible(Field名字,true);
如果说是获取Class的静态属性:则第三句换成Object property=field.get(Class名字),而不是用实例的名字。


4)执行某个对象的方法:
public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {
     Class ownerClass = owner.getClass();
     Class[] argsClass = new Class[args.length];  
     for (int i = 0, j = args.length; i < j; i++) {
          argsClass = args.getClass();
      }
      Method method = ownerClass.getMethod(methodName, argsClass);
      return method.invoke(owner, args);
}
如果是执行某个类的静态方法:method.invoke(null, args);


5)新建某对象的实例:
public Object newInstance(String className, Object[] args) throws Exception {
     Class newoneClass = Class.forName(className);  
     Class[] argsClass = new Class[args.length];   
     for (int i = 0, j = args.length; i < j; i++) {
           argsClass = args.getClass();
     }
     Constructor cons = newoneClass.getConstructor(argsClass);
     return cons.newInstance(args);
 }
这里说的方法是执行带参数的构造函数来新建实例的方法。如果不需要参数,可以直接使用newoneClass.newInstance()来实现。


6)判断是否为某个class的实例:
public boolean isInstance(Object obj, Class cls) {
     return cls.isInstance(obj);
}


7)Reflection与introspection
Reflection这个字的意思是“反射、映象、倒影”,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods1。
这种“看透class”的能力(the ability of the program to examine itself)被称为introspection(内省、内观、反省)。Reflection和introspection是常被并提的两个术语。

抱歉!评论已关闭.