cglib,全称是Code Generation Library,它可以用来动态继承Java类或者实现接口,很多知名的开源项目中用到了它,譬如Hibernate,Spring之类用它来实现动态代理。
public class MyClass { public void method() {System.out.println("MyClass.method()");}}
import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodProxy;import net.sf.cglib.proxy.MethodInterceptor; public class Main { public static void main(String[] args) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(MyClass.class);enhancer.setCallback( new MethodInterceptorImpl() ); MyClass my = (MyClass)enhancer.create(); my.method();} private static class MethodInterceptorImpl implements MethodInterceptor {public Object intercept(Object obj,Method method,Object[] args,MethodProxy proxy) throws Throwable { System.out.println(method); proxy.invokeSuper(obj, args); return null;}}}
执行结果:
public void cglib_test.MyClass.method()MyClass.method()
public class MyClass { public void method() {System.out.println("MyClass.method()");} public void method2() {System.out.println("MyClass.method2()");}}
import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodProxy;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.NoOp;import net.sf.cglib.proxy.Callback;import net.sf.cglib.proxy.CallbackFilter; public class Main { public static void main(String[] args) { Callback[] callbacks =new Callback[] { new MethodInterceptorImpl(), NoOp.INSTANCE }; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(MyClass.class);enhancer.setCallbacks( callbacks );enhancer.setCallbackFilter( new CallbackFilterImpl() ); MyClass my = (MyClass)enhancer.create(); my.method();my.method2();} private static class CallbackFilterImpl implements CallbackFilter { 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 void cglib_test.MyClass.method()MyClass.method()MyClass.method2()
public interface MyInterfaceA { public void methodA();} public interface MyInterfaceB {public void methodB();} public class MyInterfaceAImpl implements MyInterfaceA { public void methodA() {System.out.println("MyInterfaceAImpl.methodA()");}} public class MyInterfaceBImpl implements MyInterfaceB { public void methodB() {System.out.println("MyInterfaceBImpl.methodB()");}}
执行结果:import net.sf.cglib.proxy.Mixin; public class Main { public static void main(String[] args) { Class[] interfaces =new Class[] { MyInterfaceA.class, MyInterfaceB.class };Object[] delegates =new Object[] { new MyInterfaceAImpl(), new MyInterfaceBImpl() };Object obj = Mixin.create(interfaces, delegates); MyInterfaceA myA = (MyInterfaceA)obj;myA.methodA(); MyInterfaceB myB = (MyInterfaceB)obj;myB.methodB();}}
MyInterfaceAImpl.methodA()MyInterfaceBImpl.methodB()
联系客服