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)
- 获取私有构造方法,创建对象
- 获取到Class对象
- 获取指定的构造方法
- 暴力访问, 通过setAccessible(boolean flag)方法
- 通过构造方法类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()
- 获取私有成员方法
- 获取Class对象
- 获取构造方法
- 通过构造方法,创建对象
- 获取指定的方法
- method.setAccessible(true),需要开启暴力访问
- 执行找到的方法
- 用invoke()执行获取到的方法
public Object invoke(Object obj, Object... args)
执行指定对象obj中,当前Method对象所代表的方法,方法要传入的参数通过args指定。
6. 泛型擦除
程序编译后产生的.class文件中是没有泛型约束的,这种现象我们称为泛型的擦除.
版权声明:本文为qq_33552049原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。