JDK动态代理CGLIB动态代理详解
Posted lingluo2017
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDK动态代理CGLIB动态代理详解相关的知识,希望对你有一定的参考价值。
一.JDK动态代理
1.1 接口类
package jdkproxy; /** * @author admin *接口类 */ public interface IBookManage { //添加图书 public void addBook(); }
1.2 接口实现类
package jdkproxy; /** * @author admin *接口实现类 */ public class BookManage implements IBookManage { @Override public void addBook() { System.out.println("addBook..."); } }
1.3 动态代理类
package jdkproxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * @author admin * 动态代理类 */ public class DynamicProxy implements InvocationHandler { //这个就是我们要代理的真实对象 private Object realSubject; //构造方法,给我们要代理的真实对象赋初值 public DynamicProxy(Object realSubject) { this.realSubject = realSubject; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //在代理真实对象前我们可以添加一些自己的操作 System.out.println("before add book..."); System.out.println("Method:" + method); //当代理对象调用真实对象的方法时,其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用 Object result = method.invoke(realSubject, args); //在代理真实对象后我们也可以添加一些自己的操作 System.out.println("after add book..."); return result; } }
1.4 测试
package jdkproxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; public class Client { public static void main(String[] args) { // 我们要代理的真实对象 BookManage realSubject = new BookManage(); // 我们要代理哪个真实对象,就将该对象传进去,最后是通过该真实对象来调用其方法的 InvocationHandler handler = new DynamicProxy(realSubject); /* * 通过Proxy的newProxyInstance方法来创建我们的代理对象,我们来看看其三个参数 第一个参数 * handler.getClass().getClassLoader() ,我们这里使用handler这个类的ClassLoader对象来加载我们的代理对象 * 第二个参数realSubject.getClass().getInterfaces(),我们这里为代理对象提供的接口是真实对象所实行的接口, * 表示我要代理的是该真实对象,这样我就能调用这组接口中的方法了 第三个参数handler, 我们这里将这个代理对象关联到了上方的 * InvocationHandler 这个对象上 */ IBookManage proxy = (IBookManage) Proxy.newProxyInstance(handler.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), handler); System.out.println(proxy.getClass().getName()); proxy.addBook(); } }
以上是关于JDK动态代理CGLIB动态代理详解的主要内容,如果未能解决你的问题,请参考以下文章