-
廖雪峰Java反射
-
Class类
-
JVM为每个加载的类及接口创建了对应的
Class
实例来保存类及接口的所有信息;-
Class类
-
public final class Class { private Class() {} }
-
-
以
String
类为例,当JVM加载String
类时,它首先读取String.class
文件到内存,然后,为String
类创建一个Class
实例并关联起来Class cls = new Class(String);
- JVM持有的每个
Class
实例都指向一个数据类型(class
或interface
)
-
-
通过Class实例获取
class
信息的方法称为反射(Reflection);-
获取
Class cls = String.class;
String s = "Hello"; Class cls = s.getClass()
Class cls = Class.forName("java.lang.String");
-
Class
实例在JVM中是唯一的 -
实例化
-
// 获取String的Class实例: Class cls = String.class; // 创建一个String实例: String s = (String) cls.newInstance();
-
-
-
JVM总是动态加载
class
,可以在运行期根据条件来控制加载class。
-
-
访问字段
- 访问Field: getFiled()
- 访问字段信息:getName(), getType()…
- 调用
setAccessible(true)
来访问非public
字段 - 通过反射读写字段是一种非常规方法,它会破坏对象的封装。
-
访问调用方法
- getMethod()
- getNmae()
- 通过
Method
实例可以调用某个对象的方法:Object invoke(Object instance, Object... parameters)
; - 通过设置
setAccessible(true)
来访问非public
方法;
-
构造方法
Constructor
对象封装了构造方法的所有信息;- 通过
Class
实例的方法可以获取Constructor
实例:getConstructor()
,getConstructors()
,getDeclaredConstructor()
,getDeclaredConstructors()
; - 通过
Constructor
实例可以创建一个实例对象:newInstance(Object... parameters)
; - 通过设置
setAccessible(true)
来访问非public
构造方法。
-
获取继承关系
Class getSuperclass()
:获取父类类型;Class[] getInterfaces()
:获取当前类实现的所有接口。
-
动态代理
- 动态代理是通过
Proxy
创建代理对象,然后将接口方法“代理”给InvocationHandler
完成的。
- 动态代理是通过
Java反射
最新推荐文章于 2022-08-24 17:20:08 发布