在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动态代理类的理解