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动态代理详解的主要内容,如果未能解决你的问题,请参考以下文章

转载Spring AOP详解 JDK动态代理CGLib动态代理

静态代理和动态代理(jdk/cglib)详解

动态代理—— CGLIB代理原理

设计模式之代理模式详解和应用

设计模式----代理模式

JDK动态代理CGLIB动态代理