CGLIB动态代理

CGLIB动态代理是基于类继承的代理, 不能被继承的方法也不能被代理, 比如final, private修饰的方法.

CGLIB中重要的两个概念:

MethodInterceptor是方法拦截器, 代理类只需要实现该接口, 并实现intercept方法. intercept方法是代理真正调用的方法, 在这个方法里可以获取被代理类的信息并调用被代理类的方法.

Enhancer是增强器, 需要传入被代理类对象和拦截器对象(就是实现类了MethodInterceptor的类), 之后可以创建代理类对象.

现在有一个房东:

public class Host2 {

    public void rent() {
        System.out.println("房东要把房子租出去");
    }
}

一个通用的拦截器:

public class ProxyInterceptor implements MethodInterceptor {
    private Object target;

    public Object getInstance(Object target) {
        this.target = target;
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(this.target.getClass());
        // 回调方法, 下面的intercept方法就是这里调用的,所以需要代理类本身的对象
        enhancer.setCallback(this);
        // 创建代理类对象
        return enhancer.create();
    }
  	// Object ob 被代理类的对象
    // Method method 被拦截的方法
  	// Object[] objects 被拦截的方法的参数
  	// MethodProxy methodProxy 用来调用父类的方法
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        this.seeHouse();
        Object returnObj = methodProxy.invokeSuper(o, objects);
        this.hetong();
        return returnObj;
    }

    private void seeHouse() {
        System.out.println("中介带看房子");
    }

    private void hetong() {
        System.out.println("签合同");
    }
}

测试:

Host2 host2 = new Host2();
ProxyInterceptor proxyInterceptor = new ProxyInterceptor();
Host2 instance = (Host2)proxyInterceptor.getInstance(host2);
instance.rent();

测试结果:

中介带看房子
房东要把房子租出去
签合同
posted @   远大光明  阅读(41)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示