-
廖雪峰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完成的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)