Java中如何实现代理机制(JDK、CGLIB)

本文详细介绍了Java中的动态代理机制,包括JDK动态代理和Cglib动态代理的实现方式及应用场景。通过具体代码示例展示了如何创建代理类,并对两种代理方式进行了对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代理分为两种:

1.静态代理

2.动态代理

 动态代理又分为两种:jdk 实现  ;Cglib 实现

3.Java中如何实现代理机制(JDK、CGLIB)

JDK动态代理:代理类和目标类实现了共同的接口,用到InvocationHandler接口。
CGLIB动态代理:代理类是目标类的子类,用到MethodInterceptor接口。

注意:

使用版本:

首先介绍jdk 实现动态代理:

第一步:建立接口

package com.asiainfo.proxydemo;

public interface BookFacade {
     public void addBook(); 
}
第二步:实现接口

package com.asiainfo.proxydemo;

import java.io.Serializable;

public class BookFacadeImpl implements BookFacade, Serializable {
    
    public void addBook() {
        // TODO Auto-generated method stub
          System.out.println("增加图书方法。。。");  
    }

}
第三步:建立代理类

    package com.asiainfo.proxydemo;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class BookFacadeProxy implements InvocationHandler {
        
        private Object target;    
        
        public Object bind(Object target){
            this.target=target;
            return Proxy.newProxyInstance(target.getClass().getClassLoader(), (Class<?>[])                                                                           target.getClass().getGenericInterfaces(), this);
        }
    
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            // TODO Auto-generated method stub
            Object result=null;
            System.out.println("事物开始执行");
            method.invoke(target, args);
            System.out.println("事情结束");
            return null;
        }
        //代码测试
        public static void main(String[] args) {
            BookFacade target = new BookFacadeImpl();
            BookFacade bookFacadeProxy = (BookFacade) new BookFacadeProxy().bind(target);
            bookFacadeProxy.addBook();
            
         
        }
    
    }
其次是Cglib 实现:

第一步:

package com.asiainfo.proxydemo;

public class BookFacadeCglib {
     public void addBook(){
         System.out.println("addBook");
     }
}
第二步:cglib 建立测试类

package com.asiainfo.proxydemo;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class BookFacadeProxyCglib implements MethodInterceptor {
    private Object target;
    
    public Object getInstance(Object target){
        this.target=target;
        Enhancer enhancer=new Enhancer();
        enhancer.setSuperclass(this.target.getClass());
        //回调方法
        //enhancer.setCallbackType(this.target.getClass());
        enhancer.setCallback(this);
        //创建代理对象
        return enhancer.create();
    }

    public   Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        // TODO Auto-generated method stub
        System.out.println("before run");
        Object returnvalue=proxy.invokeSuper(obj, args);
        System.out.println("after run");
        return null;
    }

   //cglib代码测试 
    public static void main(String[] args) {
         BookFacadeCglib target = new BookFacadeCglib();
         BookFacadeCglib bookFacadeCglib = (BookFacadeCglib) new BookFacadeProxyCglib().getInstance(target);
         bookFacadeCglib.addBook();

    }

}
参考:http://lrd.ele.me/2017/01/09/dynamic_proxy/

       :https://blog.youkuaiyun.com/einstein10147/article/details/77040110

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

利剑 -~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值