A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

反射:
  运行时期,对一个class文件,解剖,从class文件中获取出里面的成员,运行这些成员
  
解剖一个类的话,必须先要获取到这个类文件的对象
万物都是对象,编译后的class文件也是对象

JAVA提供了一个类, java.lang.Class 类,描述编译后的class文件这个对象的

成员:
    构造方法也是对象,这个对象的描述类 java.lang.reflect.Constructor
    成员变量也是对象,这个对象的描述类 java.lang.reflect.Field
    成员方法也是对象,这个对象的描述类 java.lang.reflect.Method
   
解剖出一个类的成员,运行这些成员
A .  使用Class类,获取出被解剖的这个类的class文件对象
B .  使用Class类方法,获取出类中的所有成员
C .  将成员获取出来后,交给对应类,对应类中的方法,运行成员


如何获取,class文件对象

1. 使用类的对象获取
     每个类都使用Object作为父类,Object类方法 getClass()
     返回这个类的class文件对象,方法返回值Class类型对象
     
2. 使用类的静态属性获取
    类名.class 返回这个类的class文件对象.属性运行结果也是Class类型对象
   
3. 使用Class类的静态方法获取
   Class类静态方法 forName(String 类名) 传递字符串类名
       获取到这个类的class文件对象,方法返回值也是Class类型对象

获取class文件中的构造方法,并运行
  Class类的方法获取构造方法
    Constructor<?>[] getConstructors() 获取class文件中的公共构造方法
    Constructor<?>   getConstructor(Class...p)获取指定参数的构造方法
   
    运行获取到的构造方法-- Constructor
  Constructor类方法运行,指定构造方法
    Object  newInstance(Object...obj)运行指定构造方法,传递实际参数
   
获取class文件中的私有构造方法并运行
  Class类的方法获取构造方法
     Constructor<?>[] getDeclaredConstructors()
     Constructor<?>   getDeclaredConstructor(Class...c)传递参数列表,获取指定私有构造方法
     
  Constructor类有个父类AccessibleObject
    方法 setAccessible(true) 暴力访问 (不建议使用,单例)
    setAccessible 取消JAVA运行时期的访问限制检查
   
获取class文件中的成员变量,修改值
  Class类的方法获取成员变量
     Field[] getFields() 获取所有公共成员变量
     Field   getField(String 变量名) 传递字符串变量名,获取指定的成员变量
     
  Field类的方法set修改获取到的成员变量值,必须有这个类的对象支持
    set(Object obj,Object value)
   
获取class文件中的私有成员变量,修改值
  Class类的方法获取私有成员变量
    Field[] getDeclaredFields() 获取所有成员变量
    Field   getDeclaredField(String 变量名)获取指定的成员变量
    Field父类方法setAccessible 暴力的访问

获取class文件中的成员方法,并运行
  Class类的方法获取成员方法
    Method[]  getMethods() 获取所有公共成员方法,包括继承的
    Method    getMethod(String 方法名,Class...c)
       获取指定的成员方法,传递字符串的方法名,传递的是Class类型的参数列表
      
  Method类中,有一个方法,可以获取到通过反射获取的方法
     invoke(Object obj,Object...value)
    运行方法,必须有对象的支持, 调用方法传递的实际参数

获取class文件的私有成员方法,并运行
  Class类的方法获取私有成员方法
    Method[]  getDeclaredMethods() 获取所有成员方法,不包括继承的
    Method  getDeclaredMethod(String,Class...c) 获取指定的成员方法
    Method父类方法setAccessible 暴力的访问




0 个回复

您需要登录后才可以回帖 登录 | 加入黑马