读书人

基于Cglib的动态署理

发布时间: 2012-12-23 11:28:15 作者: rapoo

基于Cglib的动态代理
由于JDK只能基于接口进行动态代理,所以Spring使用JDK和Cglib结合使用来产生动态代理,Cglib可以进行类的动态代理

?

下面就是一个简单的动态代理例子:被代理的类
package com.lbx.dog;public class Dog {public void info() {// TODO Auto-generated method stubSystem.out.println("这是一只狗");}public void run() {// TODO Auto-generated method stubSystem.out.println("这只狗在RUN");}}

?

?

类似与拦截器的拦截方法
package com.lbx.proxy;public class DogInterceptor {public void method1(){System.out.println("第一个拦截方法");}public void method2(){System.out.println("第二个拦截方法");}}

?

?

?

代理对象的实现
package com.lbx.proxy;import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;public class CglibProxy implements MethodInterceptor {private Enhancer enhancer = new Enhancer();DogInterceptor di = new DogInterceptor();public CglibProxy(){}public Object getProxy(Class c){enhancer.setSuperclass(c);enhancer.setCallback(this);return enhancer.create();}public Object intercept(Object obj, Method method, Object[] args,MethodProxy proxy) throws Throwable {di.method1();Object result = proxy.invokeSuper(obj, args);di.method2();return result;}}

?

?

测试程序
package com.lbx.test;import com.lbx.dog.Dog;import com.lbx.proxy.CglibProxy;public class Test {public static void main(String[] args) {CglibProxy proxy = new CglibProxy();Dog proxyDog = (Dog)proxy.getProxy(Dog.class);proxyDog.info();proxyDog.run();}}

?

读书人网 >编程

热点推荐