文章目录
1.反射概述
1.1 反射概念
- 对于任意一个类,都能够知道这个类的所有属性和方法;
- 对于任意一个对象,都能够调用它的任意一个方法和属性;
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
1.2 反射原理
我们先要了解一个java程序运行的过程
java反射则是在运行期时,主动让jvm去加载某个.class文件生成Class对象,并调用其中的方法属性。(即反射的核心是操作Class对象)
2.获取Class对象的方法
- Class.forName(“全类名”) :将字节码文件加载进内存,并返回Class对象
- 类名.class :通过类名的属性class获取
- 对象.getClass() :通过Object定义的方法获取
//1.通过Class的静态方法获取
Class c1 = Class.forName("JavaSE.Person");
//2.调用运行时类本身的.class属性
Class c2 = Person.class;
//3.通过运行时类的对象获取
Class c3 = person.getClass();
注意:同一字节码文件在一次程序运行过程中,只会被加载一次,所以不论通过哪一种方式获取的Class对象都是同一个。参考原理:双亲委派模型
3.使用Class对象
3.1 成员变量 :Field
(1)Class对象获取Field
- getFields() :只能获取运行时类及其父类中声明为public的属性
- getDeclaredFields() :可以获取运行时类本身的所有属性
- getDeclaredField(“属性名”) : 获取运行时类的指定属性
(2)Field的使用
- setAccessible(true) :获取到私有属性时需要设置setAccessible,忽略访问权限修饰符的安全检查
- set(对象,值):给变量设置值
- get(对象):获取变量的值
- getName() :获取属性名
- getType() :获取属性类型(Class 类型)
- getModifiers() :获取修饰符类型代表的数字
3.2 构造器 : Constructor
(1)Class对象获取Constructor
- getConstructors():获取public的构造方法
- getConstructor(构造参数.class):根据构造参数返回构造器
- getDeclaredConstructor(构造参数.class):根据构造参数返回私有构造器
(2)Constructor的使用
- Class对象.newInstance() :(Class对象的方法)直接使用该类的无参构造器创建对象
- setAccessible(true):获取到私有构造器时需要设置setAccessible,忽略访问权限修饰符的安全检查
- newInstance(参数列表) :使用对应构造器创建对象
3.3 方法 : Method
(1)Class对象获取Method
- getMethods() :只能获取运行时类及其父类中声明为public的方法
- getDeclaredMethods() :可以获取运行时类本身的所有方法
- getDeclaredMethod(“方法名”) : 获取运行时类的指定方法
(2)Method的使用
- invoke(obj , arg…) : 执行方法,传入实例对象和相应参数
- setAccessible(true):获取到私有方法时需要设置setAccessible,忽略访问权限修饰符的安全检查
- getName() getType() getModifiers() :与获取属性调用相同的方法不再阐述
- getReturnType() :获取返回值类型(Class 类型)
- getParameterTypes() : 获取形参列表(获取的是形参的类型)
- getExceptionTypes() : 获取抛出的异常类型