Java InvocationHandler 与 Proxy 动态代理详解
Proxy 类
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h) throws IllegalArgumentException
另外两个方法:
InvocationHandler 接口
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable; 当调用代理类的任何一个方法的时候, 这里的第一个参数 一般情况乱下(target 为真实对象): public Object invoke(Object proxy,Object[] args) throws Throwable { return method.invoke(target,args); } 需要连续调用时: public Object invoke(Object proxy,Object[] args) throws Throwable { method.invoke(target,args); return proxy; } 动态代理简单实现现在,创建一个 package cloud.proxy; public interface Hero { void attack(); } 再创建一个施放雷神之怒的宙斯: package cloud.proxy; import static java.lang.System.out; public class Zues implements Hero { @Override public void attack() { out.println("雷神之怒!"); } } 最后通过 package cloud.proxy; import java.lang.reflect.Proxy; import static java.lang.System.out; public class HeroProxy { private void before() { out.println("准备施法..."); } private void after() { out.println("施法完成。"); } public Hero newInstance(final Class<? extends Hero> targetClass) throws Throwable { Hero target = targetClass.getConstructor().newInstance(); return (Hero) Proxy.newProxyInstance(Hero.class.getClassLoader(),new Class[]{Hero.class},(proxy,method,args) -> { before(); Object result = method.invoke(target,args); after(); return result; } ); } } 当调用 测试类: package cloud.proxy; import org.junit.Test; public class HeroProxyTest { @Test public void getProxyObject() throws Throwable { HeroProxy proxy = new HeroProxy(); // 创建 Zues 的代理对象 Hero hero = proxy.newInstance(Zues.class); hero.attack(); } } 执行结果: com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 cloud.proxy.HeroProxyTest 准备施法... 雷神之怒! 施法完成。 Process finished with exit code 0 Tips代理类在跟踪方法调用时很有用,比如我们可以为 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |