什么是java反射机制
Java 反射机制(Reflection)是一种在程序运行时动态地检查和操作类、方法、字段、构造函数等结构的技术。通过反射,程序可以在不知道对象具体类型的情况下,动态获取类的信息并操作对象。Java提供了一系列反射方法来操作(如获取、创建、修改、调用)Class对象、构造函数、方法、字段等。。本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息
执行流程:Animal.java文件一一>Animal.class文件一一>类加载器加载到JVM中,JVM加载到内存中–>Animal.class就会有个对象表示
常用对象的反射
类反射
Class类的实例表示正在运行的Java应用程序中的类和接口
获取class对象:
第一种 使用class.forName ()静态方法:知道类的全路径名
第二种 使用 类名.class方法:适合在编译前知道操作的CLass:
第三种 使用 类对象.getClass()
第四种 ClassLoader的loaderclass(ClassName)
:动态加载类,ClassName
指定要加载的类名。
1 | // 1. 使用 Class.forName() 动态加载类 |
通过类获取类实例
class.newInstrance()
:执行无参构造获取类实例,该方法要求class
类有无参构造方法。
1 | //1.获取类 |
构造方法反射
类的单个构造方法的信息以及对它的动态访问权限
获取构造方法
class.getConstructor(...ParameterTypes)
:获取class
类中的public权限的构造方法,ParameterTypes
指定所获取的构造方法中的参数的类型,没有则表示无参。class.getConstructors()
:获取class
类中的所有public权限的构造方法。class.getDeclaredConstructor(...ParameterTypes)
:获取class
类中的任意构造方法。class.getDeclaredConstructors()
:获取class
类中的所有构造方法。
1 | //1. 获取无参构造方法 |
通过构造方法获取类实例
constructor.newInstance(...args)
:通过constructor
构造方法构造类实例对象,根据获取到的constructor
构造方法来决定是否需要传入参数args
。constructor.setAccessible(bool)
:设置constructor
构造函数的访问权限,若bool
为true则表示取消构造函数的访问权限控制,这意味着private声明的构造函数也可以进行访问。
1 | //1.无参构造 |
字段反射
Field提供有关类或接口的单个字段信息以及动态访问权限
获取字段
class.getField(FieldName)
:获取class
类中的带public声明的FieldName
变量。class.getFields()
:获取class
类中的带public声明变量。class.getDeclaredField(FieldName)
:获取class
类中的FieldName
变量。class.getDeclaredFields()
:获取class
类中的所有变量。
1 | //1. 获取该类的publicStr字段 |
操作字段
field.getXxx(obj)
:获取obj
对象的field
字段的属性值。Xxx
代指8个基本数据类型,如果该属性类型是引用类型则直接使用Field.get(obj)
。field.setXxx(obj, value)
:将obj
对象的Field字段赋值为value
。Xxx
代指8个基本数据类型,如果该字段类型是引用类型则直接使用Field.set(obj, value)
。field.setAccessible(bool)
:设置field
字段的访问权限,若bool
为true则表示取消字段的访问权限控制,这意味着private声明的字段也可以进行访问。
1 | //1.获取类 |
方法反射
Method提供关于类或接口上单独某个方法的信息
获取方法
class.getMethod(MethodName,...ParameterTypes)
:获取class
类中的public权限的方法,MethodName
指定所要获取的方法的方法名,ParameterTypes
指定所获取的方法中的参数的类型,没有则表示无参。class.getMethods()
:获取class
类中所有public权限的方法。class.getDeclaredMethod(MethodName,...ParameterTypes)
:获取class
类中任意方法。class.getDeclaredMethods()
:获取class
类的所有方法。
1 | //获取带一个参数的且为int类型的getPublicStr方法 |
执行方法
method.invoke(obj,...args)
:调用obj
对象的method
方法,args
指定传入的参数,没有则表示无参。method.setAccessible(bool)
:设置method
方法的访问权限,若bool
为true则表示取消方法的访问权限控制,这意味着private声明的方法也可以被调用。
1 | //1.获取类 |