java动态代理之CGLib代理运用指南

1.1 CGLib代理

CGLib代理主要涉及spring-core-4.xjar包中的三个类:Enhancer,MethodInterceptor和MethodProxy。其中MethodInterceptor是spring自带的拦截接口,可以通过实现该接口,定义intercept方法拦截。而Enhancer是spring自带的类,通过字节码技术动态创建子类实例。代理类具体代码如下: 

package designMode;

import designCommon.PerfomanceMonitor;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * Created by Administrator on 2021/2/7 0007.
 */
public class CglibProxy implements MethodInterceptor {
    private Enhancer enhancer=new Enhancer();
    //1.创建需要代理对象的实例
    public Object getProxy(Class clazz){
        //1.1设置需要创建子类的类
        enhancer.setSuperclass(clazz);
        enhancer.setCallback(this);
        //1.2通过字节码技术动态创建子类实例
        return enhancer.create();

    }
    //2.拦截父类所有方法的调用
    //obj表示目标类的实例,method表示目标类的方法反射对象,args表示目标方法的动态入参,methodProxy为代理对象的实例
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        PerfomanceMonitor.begin(obj.getClass().getName()+"."+method.getName());
        Object result= methodProxy.invokeSuper(obj,args);
        PerfomanceMonitor.end();
        return result;
    }
}

测试类代码如下:

package test;

import bizServiceImpl.ForumServiceImpl;
import designMode.CglibProxy;

/**
 * Created by Administrator on 2021/2/7 0007.
 */
public class ForumServiceImplProxyTest {

    public static void main(String[] args) {
        CglibProxy proxy=new CglibProxy();
        ForumServiceImpl forumService=(ForumServiceImpl)proxy.getProxy(ForumServiceImpl.class);
        forumService.removeTopic("1024");

    }

}

其他类的代码:

package bizServiceImpl;
import bizService.ForumService;

/**
 * Created by Administrator on 2021/2/7 0007.
 */
public class ForumServiceImpl implements ForumService {

    @Override
    public void removeTopic(String topicId) {
        //开始对该方法进行监视
//        PerfomanceMonitor.begin("bizServiceImpl.ForumServiceImpl.removeTopic");
        System.out.println("模拟删除Topic记录:"+topicId);
        try{
            Thread.currentThread().sleep(20);
        }catch(Exception e){
            throw new RuntimeException();
        }
//        PerfomanceMonitor.end();
    }


}

 

1.2缺点:

   采用动态创建子类的方式生成子类对象,所以不能对目标类中的final或private方法进行代理。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值