十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这篇文章主要介绍“动态代理JDK和CGLib的方法”,在日常操作中,相信很多人在动态代理JDK和CGLib的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”动态代理JDK和CGLib的方法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
创新互联公司从2013年成立,先为西秀等服务建站,西秀等地企业,进行企业商务咨询服务。为西秀企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
创建接口及具体实现类
public interface BingoOk { /** * * @param who * @return */ public String lookLook(String who); /** * * @return */ public String ohMyGod(); } public class BingoOkImpl implements BingoOk{ @Override public String lookLook(String who) { System.out.println("推开门了"); return "让"+who+"来看看~~"; } @Override public String ohMyGod() { System.out.println("赶紧跑"); return "oh my god,看到了啥!!!"; } }
实现InvocationHandler 接口的invoke方法
public class JDKProxyLearn implements InvocationHandler { private Object object; /** * 指定需要代理的对象 * @param object */ public JDKProxyLearn(Object object){ this.object = object; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("invoke 来了。偷窥开始~"); System.out.println("method : "+method); Object invoke = method.invoke(object,args); System.out.println("invoke 完了。偷窥完了~"); return invoke; } }
具体方法及实现
public class TestJDKProxy { public static void main(String[] args) { BingoOk ok = new BingoOkImpl(); // 实现 InvocationHandler 接口,传入ok接口 代理 这个ok。具体嵌入方法 InvocationHandler handler = new JDKProxyLearn(ok); //获取 需要代理的 ok 接口的 classloader ClassLoader classLoader = ok.getClass().getClassLoader(); //获取 需要代理的 ok 接口的 interfaces Class>[] interfaces = ok.getClass().getInterfaces(); // 指定代理的 classloader ,interfaces 还有 执行 BingoOk o = (BingoOk)Proxy.newProxyInstance(classLoader, interfaces, handler); System.out.println("代理了呀 : " +o.getClass().getName()); String value = o.lookLook("海少"); System.out.println(value); // String s = o.ohMyGod(); // System.out.println(s); } }
关键方法是 Proxy.newProxyInstance
,对应生成的最终的class可以发现,对象 继承了 Proxy类 实现了 自定义的接口。 因为Java 单继承多实现,所以 JDK动态代理对象不支持对实现类的代理,只支持接口的代理。
直接新建需要代理的类
public class BingoOk { public String lookLook(String who) { System.out.println("推开门了"); return "让"+who+"来看看~~"; } public String ohMyGod() { System.out.println("赶紧跑"); return "oh my god,看到了啥!!!"; } }
实现MethodInterceptor的intercept方法
public class CGLibProxyLearn implements MethodInterceptor { @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("invoke 来了。偷窥开始~"); System.out.println("method : "+method); Object invoke = methodProxy.invokeSuper(o,objects); System.out.println("invoke 完了。偷窥完了~"); return invoke; } }
具体方法及实现
public class TestCGLibProxy { public static void main(String[] args) { BingoOk ok = new BingoOk(); Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(ok.getClass()); enhancer.setCallback(new CGLibProxyLearn()); BingoOk instance = (BingoOk)enhancer.create(); System.out.println("代理开始了" + instance.getClass().getName()); String value = instance.lookLook("海少2"); System.out.println(value); } }
关键注意Enhancer 增强类,设置增强类的类型,和代理方法。创建代理对象并通过代理对象执行。对应生成的最终的class可以发现,代理对象继承了 实现类,实现了 Factory 接口。所以相当于通过子类来实现的。
到此,关于“动态代理JDK和CGLib的方法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!