标签:rri 委托 handler eal 代理 idt throw oca nbsp
代理对象和委托对象继承相同接口,并控制外部对委托对象的访问。
1. 静态代理: 代理对象在编译期确定。
接口(Human):
public interface Human{ public void eatFood(); }
委托类(HumanImpl):
public class HumanImpl implements Human{ public void eatFood(){ System.out.print("真香!"); } }
代理类(HumanProxy):
public class HumanProxy implements Human{ private Human human; public HumanProxy(Human human){ this.human = human; } public void eatFood(){ before(); human.eatFood(); after(); } }
2. 动态代理: 运行期生成代理对象
在代理类和委托类之间生成中介类,该类实现 InvocationHandler 接口。对委托对象方法的调用会转到中介对象的invoke()方法中,method标识了调用哪一个方法,args代表方法参数。
不需要实现代理的接口。
public class HumanDynamicProxy implements InvocationHandler{ //委托对象 private Human human; public HumanDynamicProxy(Human human){ this.human = human; }
@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { before(); Object result = method.invoke(human, args); after(); return result; } }
测试代码:
public static void main(String[] args){ //委托对象 Human realHuman = new HumanImpl(); //中介 InvocationHandler handler = new HumanDynamicProxy(human); //动态代理 Human proxy = (Human) Proxy.newProxyInstance(realHuman.getClass().getClassLoader(), realhuman.getClass().getInterfaces(), handler); //通过代理类,执行方法; proxy.eatFood();
标签:rri 委托 handler eal 代理 idt throw oca nbsp
原文地址:https://www.cnblogs.com/walker993/p/9439619.html