码迷,mamicode.com
首页 > 其他好文 > 详细

JDK动态代理、CGLIB动态代理详解

时间:2019-01-17 20:04:50      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:handle   getname   icp   admin   invoke   static   int   测试   err   

一.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动态代理详解

标签:handle   getname   icp   admin   invoke   static   int   测试   err   

原文地址:https://www.cnblogs.com/lingluo2017/p/10283674.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!