在spring,hibernate等开源框架中使用了cglib (Code Generation Library),它可以用来动态继承Java类和实现接口,而Proxy必须基于接口.用google搜索了一下,发现这方面的文档非常少,除了白衣写的一篇<cglib的应用>外,另外就是一篇未知源头的一篇文章,现在我就参考这两个文章来解析一下cglib的使用
public static void main(String[] args) {
/** style1.增强一个已有类 */
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(SampleClass.class);
enhancer.setCallback(new MethodInterceptorImpl());
SampleClass sampleClazz1 = (SampleClass) enhancer.create();
sampleClazz1.method1();
/** style2.使用CallbackFilter */
Callback[] callbacks = new Callback[] { new MethodInterceptorImpl(), NoOp.INSTANCE };
Enhancer enhancer2 = new Enhancer();
enhancer2.setSuperclass(SampleClass.class);
enhancer2.setCallbacks(callbacks);
enhancer2.setCallbackFilter(new CallbackFilterImpl());
SampleClass sampleClazz2 = (SampleClass) enhancer2.create();
sampleClazz2.method1();
sampleClazz2.method2();
/** style3.使用Mixin */
Class[] interfaces = new Class[] { SampleInterfaceA.class, SampleInterfaceB.class };
Object[] delegates = new Object[] { new SampleInterfaceAImpl(), new SampleInterfaceBImpl() };
Object obj = Mixin.create(interfaces, delegates);
SampleInterfaceA sampleInterfaceA = (SampleInterfaceA) obj;
sampleInterfaceA.methodA();
SampleInterfaceB sampleInterfaceB = (SampleInterfaceB) obj;
sampleInterfaceB.methodB();
}
private static class CallbackFilterImpl implements CallbackFilter {
/** 返回的值,为指定Callback[]数组中index的值 */
public int accept(Method method) {
if (method.getName().equals("method2"))
return 1;
else
return 0;
}
}
private static class MethodInterceptorImpl implements MethodInterceptor {
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.out.println(method);
return proxy.invokeSuper(obj, args);
}
}
其中:
public class SampleInterfaceAImpl implements SampleInterfaceA {
public void methodA() {
System.out.println("SampleInterfaceAImpl.methodA()");
}
}
public class SampleInterfaceBImpl implements SampleInterfaceB {
public void methodB() {
System.out.println("SampleInterfaceBImpl.methodB()");
}
}
简单分析一下:
style1: 最基本的使用示例,在白衣文章中所举的log例子中已经使用了.
style2: 有多个callback时,利用
CallbackFilter属性不同的方法可以选择callback进行执行.
style3: 混合使用,配置好之后可以随意调用.
附:
Proxy(Java 动态代理相关)1.使用Java 动态代理实现AOP
2.对代理模式与Java动态代理类的理解