学习笔记 Cglib的使用

使用过程

创建一个类继承接口 MethodInterceptor并重写其中的public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) 因为方法里面要调用  你需要增强的代码  是用反射里面的invoke 所以需要传递一个对象  所以我们可以在构造这个类的时候顺便传进来

   /**
     *
     * @param method  为需要增强的方法
     * @param args 为要增强方法的需要的参数
     * @return 返回的类型必须是增强方法的返回值类型 否则会有报错 例如
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to [Ljava.lang.String;
    at com.example.tests.jdkProxy.TC1$$EnhancerByCGLIB$$4b1548e0.say(<generated>)
    at com.example.tests.cglib.cglibDemo.main(cglibDemo.java:11)
     * @throws Throwable
     */


import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class T1Interceptor implements MethodInterceptor {
   private  Object target;

    public T1Interceptor(Object target) {
        this.target = target;
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("cglib增强的功能前");
        Object re=method.invoke(target,objects);
        System.out.println("cglib增强的功能后");
        return re;
    }
}

学习所准备的要增强的类

public class TC1  {
    public String[] say(String...str){
        System.out.println("原有代码执行开始");
        for (int i = 0; i <str.length ; i++) {
            System.out.println("TC1的say开始工作第"+i+"个参数是"+str[i]);
        }
        System.out.println("原有代码执行结束");
        return str;
    }
}

下面是如何调用增强后的方法

   public static void main(String[] args) {
        TC1 tc1 = new TC1();
        T1Interceptor t1Interceptor=new T1Interceptor(tc1);
         TC1 newTC1= (TC1) Enhancer.create(tc1.getClass(),t1Interceptor);
        String[] re=newTC1.say(new String[]{"狗1","狗2","狗3"} );
        System.out.println("测试得到的增强方法的返回值为"+re);
    }

结果如下

cglib增强的功能前
原有代码执行开始
TC1的say开始工作第0个参数是狗1
TC1的say开始工作第1个参数是狗2
TC1的say开始工作第2个参数是狗3
原有代码执行结束
cglib增强的功能后
测试得到的增强方法的返回值为[Ljava.lang.String;@3581c5f3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值