Java的反射

1. 为什么使用反射?

在企业的项目开发中,反射用的极为普遍。Java的反射机制是在运行状态下。
对于任意一个类,能够知道该类的所有属性和方法;
对于任意一个对象,能够调用它的任意一个方法和属性。

2. 获取Class对象的三种方法

1.
    Person p = new Person();
    Class c = p.getClass();
2.
    Class c = Person.class;
3.
    Class.forName("Person");

3. 通过反射获取构造方法、并创建对象

在反射机制中,将类的成员(构造方法、成员方法、成员变量)都封装成对应的类进行表示。
- 返回一个构造方法

// 获取public修饰, 指定参数类型所对应的构造方法
public Constructor<T> getConstructor(Class<?>... parameterTypes) 
// 获取包括private修饰的指定参数类型锁对应的构造方法
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 
  • 返回多个构造方法
// 获取所有public修饰的构造方法
public Constructor<?>[] getConstructors()
// 获取包括private修饰的所有构造方法
public Constructor<?>[] getDeclaredConstructors()
  • 创建对象
public T newInstance(Object... initargs)
  • 获取私有构造方法,创建对象
    1. 获取到Class对象
    2. 获取指定的构造方法
    3. 暴力访问, 通过setAccessible(boolean flag)方法
    4. 通过构造方法类Constructor中的方法,创建对象
      public T newInstance(Object… initargs)

4. 通过反射获取成员变量

在反射机制中,把类中的成员变量使用Field表示
1. 获取Class对象
2. 获取构造方法
3. 通过构造方法,创建对象
4. 获取指定的成员变量(私有成员变量,必须通过setAccessible(boolean flag)方法暴力访问)
5. 通过方法,给指定对象的指定成员变量赋值或者获取值

  • 返回一个成员变量
public Field getField(String name)
  • 返回多个成员变量
public Field[] getFields() 获取所有的public修饰的变量
public Field[] getDeclaredFields() 获取包括private修饰的所有变量

5. 通过反射获取(私有)员变量方法

  • 返回获取一个方法
// 获取public 修饰的方法
public Method getMethod(String name, Class<?>... parameterTypes)

// 获取任意的方法,包含私有的    
public Method getDeclaredMethod(String name, Class<?>... parameterTypes)    
参数1: name 要查找的方法名称; 参数2: parameterTypes 该方法的参数类型
  • 返回获取多个方法
// 获取本类与父类中所有public 修饰的方法
public Method[] getMethods() 
// 获取本类中所有的方法(包含私有的)
public Method[] getDeclaredMethods()
  • 获取私有成员方法
    1. 获取Class对象
    2. 获取构造方法
    3. 通过构造方法,创建对象
    4. 获取指定的方法
    5. method.setAccessible(true),需要开启暴力访问
    6. 执行找到的方法
    7. invoke()执行获取到的方法
public Object invoke(Object obj,  Object... args) 
执行指定对象obj中,当前Method对象所代表的方法,方法要传入的参数通过args指定。

6. 泛型擦除

程序编译后产生的.class文件中是没有泛型约束的,这种现象我们称为泛型的擦除.


版权声明:本文为qq_33552049原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。