在spring,hibernate等開源框架中使用了cglib (Code Generation Library),它可以用來動態(tài)繼承Java類和實現(xiàn)接口,而Proxy必須基于接口.
用google搜索了一下,發(fā)現(xiàn)這方面的文檔非常少,除了白衣寫的一篇<cglib的應用>外,另外就是一篇未知源頭的一篇文章,現(xiàn)在我就參考這兩個文章來解析一下cglib的使用
簡單分析一下:
style1: 最基本的使用示例,在白衣文章中所舉的log例子中已經(jīng)使用了.
style2: 有多個callback時,利用CallbackFilter屬性不同的方法可以選擇callback進行執(zhí)行.
style3: 混合使用,配置好之后可以隨意調(diào)用.
附:
用google搜索了一下,發(fā)現(xiàn)這方面的文檔非常少,除了白衣寫的一篇<cglib的應用>外,另外就是一篇未知源頭的一篇文章,現(xiàn)在我就參考這兩個文章來解析一下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[]數(shù)組中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);
}
}
其中:/** 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[]數(shù)組中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()");
}
}
public void methodA() {
System.out.println("SampleInterfaceAImpl.methodA()");
}
}
public class SampleInterfaceBImpl implements SampleInterfaceB {
public void methodB() {
System.out.println("SampleInterfaceBImpl.methodB()");
}
}
簡單分析一下:
style1: 最基本的使用示例,在白衣文章中所舉的log例子中已經(jīng)使用了.
style2: 有多個callback時,利用CallbackFilter屬性不同的方法可以選擇callback進行執(zhí)行.
style3: 混合使用,配置好之后可以隨意調(diào)用.
附: