1. 类加载机制: ClassLoader
2. 获取class文件的三种方式:
1. 源文件阶段,编译期 (Person.java) class.forName(String className) 一般用于配置文件读取
2. 字节码阶段 ,运行期(Person.class) 类名.class 当做静态方法的锁对象
3. 创建对象阶段,运行期(Person p=new Person) p.getClass() 用于判断是否是同一个字节码对象(equals方法中会用到)
3. Class对象的API
1. <T> newInstance() 用该类的无参构造创建对象,如果对象没有无参构造,报错InstantiationException
2. Constructor getConstructor(参数的字节码对象 比如:String.class) 获取有参构造
3. Field getField(String str) 获取类中可见的属性(也叫字段)
4. Field getDeclaedField(String str) 获取类中私有属性,还需要去除访问权限 setAccessible(true)
Field Api:
get(obj) 获取到该属性在obj中的值
set(obj,value)然后在通过set方法改变该属性在obj的值
5. Method getMethod(String methodName , Class<?> parameterTypes) 方法名称,参数的class文件
Method api:
invoke(Object obj,Object args) 指定对象,传入的参数
4. 动态代理: 就是A让另一个类,通过反射的方式,来执行A 中的方法功能,在实现代理时可以加强功能
1. JDK中在Java中java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过使用这个类和接口就可以生成动态代理对象。JDK提供的代理只能针对接口做代理。我们有更强大的代理cglib,
Proxy类中的方法创建动态代理类对象
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
Object obj = Proxy.newProxyInstance(xx.getClass().getClassLoader,xx.getClass().getInterfaces, h)
最终会调用InvocationHandler的方法,需要实现h的子类,重写下面方法,增加你想要的功能
InvocationHandler Object invoke(Object proxy,Method method,Object[] args)
new InvocationHander(){
Object invoke(Object proxy,Method method,Object[] args){
//想要的功能
//method.invoke(obj,args); 执行obj自己的方法功能
}
}