首页 > 其他分享 >CGLIB动态代理

CGLIB动态代理

时间:2023-02-15 15:13:33浏览次数:38  
标签:target Object 代理 Host2 CGLIB 动态 方法 public

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();

测试结果:

中介带看房子
房东要把房子租出去
签合同

标签:target,Object,代理,Host2,CGLIB,动态,方法,public
From: https://www.cnblogs.com/yuandaguangming/p/17123089.html

相关文章

  • uniapp中动态计算屏幕高度问题
    在html中可使用动态高度   在data中winHeight:'',在onLoad中this.scrollH() 在方法中使用//动态计算高度 scrollH:function(){ letsys=uni.getS......
  • 时隔多年,这次我终于把动态代理的源码翻了个地儿朝天
    本文内容整理自博学谷狂野架构师动态代理简介​ Proxy模式是常用的设计模式,其特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消......
  • ps 如何制作动态打字图?
     1.情景展示有几句话,想以打字的形式出现,而不是干巴巴的几个字,如何实现这个有趣的效果呢?2.解决方案第一步:录制屏幕:将想展示的文字逐字打出来--》保存;第二步:将录......
  • 【Azure 应用服务】在App Service for Windows中实现反向代理
    问题描述如何在AppServiceforWindows(.NETStack)中,如何实现反向代理呢?正向代理:客户端想要访问一个服务器,但是它可能无法直接访问这台服务器,这时候这可找一台可以访......
  • Mybatis12 - 动态SQL
    动态SQLMybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了解决拼接SQL语句字符串时的痛点问题。Oneofthemostpowerfulfeatures......
  • 通过Vue解决跨域问题(proxy配置代理)【转载】
    当我们在用本机去找服务器要数据时会产生跨域问题,所以利用vue-cli去开启一个代理服务器。方法一:在vue.config.js中添加如下配置//开启代理服务器(方式一)devServer......
  • vue路由的使用,命名,参数,范式,嵌套,动态匹配
    基本使用:1,让Vue使用该VueRouter创建,Vue.use(VueRouter);2,创建router对象varrouter=newVueRouter({});3,在创建的router对象中配置路由对象,路由匹配的规则,var......
  • 更简单的原型语法和原型语法的动态性
    更简单的原型语法为减少不必要的输出,也从视觉上更好的封装原型的功能,用一个包含所有属性和方法的对象字面量来重写整个原型对象:functionPerson(){}Person.prototyp......
  • 顺序表应用8:最大子段和之动态规划法(SDUT 3665)
    ProblemDescription 给定n(1<=n<=100000)个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负......
  • echarts 从后端获取数据,动态渲染图表
    echarts从后端获取数据,动态渲染图表简介echarts的数据是在初始化后setOption中直接填入的,但是很多时候可能数据需要异步加载后再填入。ECharts中实现异步数据的更新非......