使用过程
创建一个类继承接口 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