Cglib是动态代理的一种实现方式,用来代理普通的javaBean,
/**
* 实现MethodInterceptor
* @author MyComputer
*
*/
public class CGLibProxy implements MethodInterceptor{
// Generates dynamic subclasses to enable method interception
private Enhancer enhancer = new Enhancer();
/**
* this 表示为回调函数,此处为执行代理时候执行的一些操作
* @param suoperClass 用户代理的父类
* @return
*/
public <T>T getProyInfo(Class<T> suoperClass){
return (T)enhancer.create(suoperClass,this);
}
/**
* enhancer.create()的返回对象调用方法时候进入的拦截方法,可以执行自己的逻辑
*/
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.err.println("-------调用方法之前---------------");
// 调用父类中方法
Object invokeSuper = proxy.invokeSuper(obj, args);
System.err.println("-------调用方法之后---------------");
return invokeSuper;
}
}
public class CGLibTest {
public String cgLibTest(String str){
System.err.println("-----------------调用反射方法传入的param为:------"+str);
return "调用反射方法返回"+str;
}
/**
* 此处用test测试,如果用main方法测试,则回报错误:
* java.lang.NoClassDefFoundError: net/sf/cglib/proxy/MethodInterceptor
* 这是由于此时没有项目中的jar包没有用maven管理,无法打到依赖项目的目的。
*/
@Test
public void test() {
CGLibProxy cgLibProxy = new CGLibProxy();
CGLibTest proyInfo = cgLibProxy.getProyInfo(CGLibTest.class);
String cgLibTest = proyInfo.cgLibTest("调用反射");
System.err.println(cgLibTest);
}
}
最终输出的结果为:
-------调用方法之前---------------
-----------------调用反射方法传入的param为:------调用反射
-------调用方法之后---------------
调用反射方法返回调用反射