在使用cxf时,发现给一个接口在配置文件中配置一下,不需要实现类就可以直接调用,仔细研究了一下CGLib,分享一下心得。
CGLib代理的原理是通过二进制流生成一个动态class,该class继承被代理类以实现动态代理。那么就提供了一个代理无实现类的接口的可能。代码如下。
/**
* 被代理接口
*/
public interface TestInterface {
String getHalloWorld();
}
/**
* 代理类
*/
public class TestCGLib implements MethodInterceptor {
public Object getInstance(Class claxx) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(claxx);
// 回调方法
enhancer.setCallback(this);
// 创建代理对象
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
return method.getName();
}
}
/**
* 执行
*/
public class TestCGLibMain {
public static void main(String[] args) {
TestCGLib testCGLib = new TestCGLib();
TestInterface o = (TestInterface) testCGLib.getInstance(TestInterface.class);
System.out.println(o.getHalloWorld());
}
}
//输出结果
getHalloWorld
代理成功!