动态代理
代理模式概述
为什么要有“代理”?生活中就有很多代理的例子,例如,我现在需要出国,但是我不愿意自己去办签证、预定机票和酒店(觉得麻烦 ,那么就可以找旅行社去帮我办,这时候旅行社就是代理,而我自己就是被代理了。
代理模式的定义:被代理者没有能力或者不愿意去完成某件事情,那么就需要找个人代替自己去完成这件事,这个人就是代理者, 所以代理模式包含了3个角色: 被代理角色 代理角色 抽象角色(协议)
静态代理:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| public interface Happy { public abstract void happy(); }
public class JinLian implements Happy {
public void happy(){ System.out.println("金莲在happy..."); }
}
public class WangPo implements Happy{ JinLian jl;
public WangPo(JinLian jl) { this.jl = jl; }
@Override public void happy() { System.out.println("王婆以做衣服的名义开好房间,并把2人约到房间里..."); jl.happy(); System.out.println("王婆打扫战场..."); } }
public class XiMen { public static void main(String[] args) {
JinLian jl = new JinLian();
Happy wp = new WangPo(jl); wp.happy(); } }
|
动态代理介绍
动态代理相关api介绍
Java.lang.reflect.Proxy类可以直接生成一个代理对象
- Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)生成一个代理对象
- 参数1:ClassLoader loader 被代理对象的类加载器
- 参数2:Class<?>[] interfaces 被代理对象的要实现的接口
- 参数3:InvocationHandler h (接口)执行处理类
- 返回值: 代理对象
- 前2个参数是为了帮助在jvm内部生成被代理对象的代理对象,第3个参数,用来监听代理对象调用方法,帮助我们调用方法
- InvocationHandler中的Object invoke(Object proxy, Method method, Object[] args)方法:调用代理类的任何方法,此方法都会执行
- 参数1:代理对象(慎用)
- 参数2:当前执行的方法
- 参数3:当前执行的方法运行时传递过来的参数
- 返回值:当前方法执行的返回值
案例-代理方法无参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| public interface Happy { public abstract void happy(); }
public class JinLian implements Happy {
public void happy(){ System.out.println("金莲在happy..."); }
}
public class XiMen { public static void main(String[] args) {
JinLian jl = new JinLian();
Happy wp = new WangPo(jl); wp.happy();
System.out.println("=========================================");
Happy p = (Happy) Proxy.newProxyInstance(JinLian.class.getClassLoader(), JinLian.class.getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getName().equals("happy")){ System.out.println("王婆以做头发的名义把金莲和西门约到房间..."); method.invoke(jl); System.out.println("王婆打扫战场..."); } return null; } });
p.happy(); } }
|