动态代理
- 只学一个方法
方法的作用:在运行时,动态创建一组指定的接口的实现类对象!(在运行时,创建实现了指定的一组接口的对象)
interface A {
}
interface B {
}
Object o = 方法(new Class[]{A.class,B.class})
o它实现了A和B两个接口!
Object proxyObject = Proxy.newProxyInstance(ClassLoader classLoader, Class[] interfaces, InvocationHandler h);
- 方法作用:动态创建实现了interfaces数组中所有指定接口的实现类对象!
参数; - ClassLoader:类加载器!
- 它是用来加载器的,把.class文件加载到内存,形成Class对象!
- Class[] interfaces:指定要实现的接口们
- InvocationHandler:代理对象的所有方法(个别不执行,getClass())都会调用InvocationHandler的invoke()方法。
package cn.itcast.demo1;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.junit.Test;
public class Demo1 {
@Test
public void fun1() {
/*
* Proxy.newProxyInstance(loader, interfaces, h)
* 运行时,这个方法需要动态生成一个类,这个类实现了A,B接口,最终返回这个类的对象!
* 生成的这个类也需要加载到内存中的方法区中,谁来加载,当然是ClassLoader
* 三大参数:
* 1.ClassLoader loader = this.getClass().getClassLoader();
* 当初是谁加载的我,我现在把这个类加载器给你
*
* 2.Class[] interfaces
* 他是要实现的接口们
*
* 3.InvocationHandler
* 它是调用处理器,是一个接口,他只有一个方法invoke()
*/
ClassLoader loader = this.getClass().getClassLoader();
InvocationHandler h = new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("你好,动态代理!");
return null;
}
};
//使用三大参数创建代理对象!!!
Object o = Proxy.newProxyInstance(loader, new Class[]{A.class,B.class}, h);
//这说明,对象o对应的类(实现类),实现了接口A,B
A a = (A)o;
B b = (B)o;
// a.a();
// a.aa();
// b.b();
// b.bb();
/*
* 你好,动态代理!
* 你好,动态代理!
* 你好,动态代理!
* 你好,动态代理!
*/
o.toString();
o.equals(null);
o.getClass();//不输出,不会调用invoke(),其底层是用c是实现的
/*
* 你好,动态代理!
* 你好,动态代理!
*/
//总结:Object 的大部分方法和实现的接口中的方法都会调用invoke()
}
}
interface A {
public void a();
public void aa();
}
interface B {
public void b();
public void bb();
}