java反射机制详解

1. 反射机制是什么?

  反射机制就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,并能够直接操作程序的内部属性, 还能够动态实例化该类的对象等。

2. 反射机制能做什么?

  • 在运行时判断任意一个对象所属的类
  • 在运行时构造任意一个类的对象
  • 在运行时判断任意一个类所具有的成员变量和方法,包括构造方法、实现的接口、父类
  • 在运行时调用任意一个对象的方法

3. 三种生成Class对象的方法

  1. 类名.class
      虚拟机将类装入内存,但不做类的初始化工作,返回Class对象
  2. Class.forName("包名.类名")
      虚拟机静态加载类,对类进行静态初始化
  3. 实例对象.getClass()
      对类进行静态初始化非静态初始化;返回实例对象运行时真正所指的对象(,即最终子类对象, 因为:子对象的引用可能会赋给父对象的引用变量中)所属的类的Class的对象

4. 反射机制常用API

  1. 通过一个对象获得完整包名和类名
Reflect reflect = new Reflect();
System.out.println(testReflect.getClass().getName());
//  .getName(): 返回类名/方法名
  1. 获取一个对象的父类、实现的接口和构造函数
Class<?> class = Class.forName("test.Reflect");
//取得父类
Class<?> parentClass = class.getSuperclass();
//获得所有接口
Class<?> intes[] = class.getInterfaces();
//获得全部的构造函数
Constructor<?> cons[] = class.getConstructors();
  1. 更多API
    Field getField(String name) 获取名为name的public字段
    Field getFields()获取所有的public字段
    Field getDeclaredField(String name)获取名为name的所有字段,包括public、private、protected
    Field getDeclaredFields()获取所有的字段,包括public、private、protected
    Constructor[] getConstructors()
    Constructor getConstructor(Class[] params)返回形参结构与params顺序相同的构造函数
    Method[] getMethods()
    Method getMethod(String name, Class[] params)返回名称为name,形参结构与params顺序相同的方法

  2. 开始使用Reflection:
    用于reflection的类,都可以在java.lang.reflect包中找到.使用步骤
    (1)获得想操作的类的java.lang.Class对象, 如 String.class、Class.forName("java.lang.String")、str.getClass();
    (2)调用getDeclaredMethods()等方法, 以获取该类中定义的方法列表
    (3)使用reflection API来操作这些信息

    • field的简单应用
    Rectangle r = new Rectangle(2, 3);
    Field heightField = r.getClass().getField("height");
    System.out.println(heightField.get(r));//结果: 3
    heightField.set(r, 1);
    System.out.println(heightField.get(r));//结果: 1
    
posted @ 2017-07-22 16:22  littleSnow  阅读(276)  评论(0)    收藏  举报