动态代理
1. 只学一个方法:
Object proxyObject = Proxy.newProxyInstance(ClassLoader classLoader, Class[] interfaces, InvocationHandler h);
方法的作用:在运行时,动态创建一组指定的接口的实现类对象!(在运行时,创建实现了指定的一组接口的对象)
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);
1. 方法作用:动态创建实现了interfaces数组中所有指定接口的实现类对象!
三大参数介绍:
1. ClassLoader:类加载器!
* 它是用来加载器的,把.class文件加载到内存,形成Class对象!
2. Class[] interfaces:指定要实现的接口们
3. InvocationHandler:被代理的对象的所有方法(个别不执行,getClass())都会调用InvocationHandler的invoke()方法。
说明:也就是说,实现动态代理需要三大参数。
2. 动态代理作用
最终是学习AOP(面向切面编程),它与装饰者模式有点相似,它比装饰者模式还要灵活!
InvocationHandler
public Object invoke(Object proxy, Method method, Object[] args);
?
这个invoke()方法在什么时候被调用!
1. 在代理对象被创建时?错误的!
2. 在调用代理对象所实现接口中的方法时?正确的!
?
* Object proxy:当前对象,即被代理的对象!在调用谁的方法!
* Method method:当前被调用的方法(目标对象的方法)
* Object[] args:实参!
他们之间的对应关系:
目标对象:被增强的对象
代理对象:需要目标对象,然后在目标对象上添加了增强后的对象!
目标方法:增强的内容
代理对象 = 目标对象 + 增强
?
实例:使用 三大参数来创建 代理对象:Dome1.java
/** * @function: * @author not-bug * */ public ????@Test ????public ????????/* ???????? * 三大参数 ???????? * 1. ClassLoader ???????? * 方法需要动态生成一个类,这个类实现了A、B接口,然后创建这个类的对象! ???????? * 需要生成一个类,这个类也需要加载到方法区中,谁来加载,当然是ClassLoader!!! ???????? * ???????? * 2. Class[] interfaces ???????? * 它是要实现的接口们,也就是说,你需要实现的接口 ???????? * ???????? * 3. InvocationHandler ???????? * 它是调用处理器 ???????? * 敷衍它! ???????? * ???????? * 代理对象中实现所有接口中的方法,内容都是调用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 ????????????} ????????}; ????????// 使用三大参数创建代理对象!!! ????????Object o = Proxy.newProxyInstance(loader, new Class[]{A.class, B.class}, h); ???????? ????????// 强转成A和B类型,成功了! ????????A a = (A) o; ????????B b = (B) o; ???????? //????????a.a(); //????????a.aa(); //????????b.b(); //????????b.bb(); ???????? //????????System.out.println(o.getClass().getName()); ????????//调用被代理对象所实现的接口方法,其实是在调用InvocationHandler的invoke()方法。 ????????Object result = a.aaa("hello", 100); ????????System.out.println(result); ????} } ? interface A { ????public ????public ????public Object aaa(String s, int } ? interface B { ????public ????public } |
?
该实例运行结果: