aop - cglib代理(实例)

本文介绍了CGlib代理机制,它通过继承目标对象来实现代理。讲解了MethodInterceptor接口在反射调用目标方法中的应用,以及如何创建接口、目标对象、代理对象和进行客户端调用。还讨论了CGlib生成的字节码文件特点,指出final和private方法无法被代理。
摘要由CSDN通过智能技术生成

cglib代理- 通过继承的方式实现代理类

  • MethodInterceptor :通过MethodProxy.invokeSuper()反射调用目标对象的方法

代码实现:
1、创建接口

package jdk;

public interface Subject {
   
    void request();
    void hello();
}

2、创建目标对象

package jdk;
/**
 * @author :panda
 * 目标对象
 */
public class RealSubject implements Subject {
   
    public void request() {
   
        System.out.println("real subject execute request..");
    }
    public void hello() {
   
        System.out.println("real subject execute hello..");
    }
}

3、创建代理对象

package cglib;

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

import java.lang.reflect.Method;

public class CglibProxyInterceptor implements MethodInterceptor {
   
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
   
        System.out.println(" before in cglib..");
        Object result = null;
        try {
   
        //通过反射调用目标对象方法
            result = methodProxy.invokeSuper(o, objects);

        } catch (Exception e) {
   
            System.out.println("get ex:" + e.getMessage());
            throw e;
        } finally {
   
            System.out.println("after in cglib..");
        }
        return result;
    }
}

4、客户端

package cglib;

import jdk.*;
import net.sf.cglib.proxy.Enhancer;

public class Client {
   
    public static void main(String[] args) {
   
	    //保存字节码文件到本地
	    System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "D:\\cglibCode");
        Enhancer enhancer = new Enhancer();
        //生成指定类对象的子类,也就是重写类中的业务函数
        enhancer.setSuperclass(RealSubject.class);
        //这里是回调函数,加入intercept()函数
        enhancer.setCallback(new CglibProxyInterceptor());
        //创建这个子类对象
        Subject subject =(Subject) enhancer.create();
        subject.hello();
        subject.request();
    }
}

4、输出
在这里插入图片描述

5、生成的字节码文件
可以看到代理类继承了目标对象,cglib代理对象是目标对象的子类
1、每个代理对象的方法都生成了两个 final 类型得方法
2、目标对象中final修饰的方法、private方法不能被代理

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package jdk;

import java.lang.reflect.Method;
import net.sf.cglib.core.ReflectUtils;
import net.sf.cglib.core.Signature;
import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.Factory;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class RealSubject$$EnhancerByCGLIB$$8663f43f extends RealSubject implements Factory {
   
    private boolean CGLIB$BOUND;
    public static Object CGLIB$FACTORY_DATA;
    private static final ThreadLocal CGLIB$THREAD_CALLBACKS;
    private static final Callback[] CGLIB$STATIC_CAL
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值