CGLib动态署理实现
CGLib动态代理实现
在以前学习JDK的动态代理时,了解到JDK动态代理是必须基于接口实现的,没有接口的话就不能使用JDK的动态代理,为代码添加新的应用逻辑。为了解决这个问题,可以使用CGLib动态代理。
下面就用CGLib动态代理实现一个简单的例子。在开始之前需要导入CGLib的jar包,这个jar包在Spring中可以找到,我导入的是cglib-nodep-2.1.3.jar。
一,首先,定义一个Person类:
二,定义一个代理类
三 定义一个测试类
四 输出结果
----Before print------
Person's print method!
----After print-------
可以看到在执行Person类中的print方法前后,加入了新的逻辑,实现了一个简单的动态代理。
在以前学习JDK的动态代理时,了解到JDK动态代理是必须基于接口实现的,没有接口的话就不能使用JDK的动态代理,为代码添加新的应用逻辑。为了解决这个问题,可以使用CGLib动态代理。
下面就用CGLib动态代理实现一个简单的例子。在开始之前需要导入CGLib的jar包,这个jar包在Spring中可以找到,我导入的是cglib-nodep-2.1.3.jar。
一,首先,定义一个Person类:
package com.lyg.proxy; public class Person { public void print(){ System.out.println("Person's print method!"); } }
二,定义一个代理类
package com.lyg.proxy; import java.lang.reflect.Method; import net.sf.cglib.proxy.Callback; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import net.sf.cglib.proxy.NoOp; public class PersonCglib implements MethodInterceptor{ private Object object; public Object getInstance(Object object){ this.object = object; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(this.object.getClass()); //设置回调方法 enhancer.setCallback(this); //enhancer.setCallbacks(new Callback[]{this,NoOp.INSTANCE}); //返回创建的代理对象 return enhancer.create(); } @Override public Object intercept(Object object, Method method, Object[] args, MethodProxy proxy) throws Throwable { // TODO Auto-generated method stub //加入方法处理前逻辑 System.out.println("----Before print------"); proxy.invokeSuper(object, args); //加入方法处理后逻辑 System.out.println("----After print-------"); return null; } }
三 定义一个测试类
package com.lyg.proxy; public class TestPersonCglib { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub PersonCglib pc = new PersonCglib(); Person person = (Person) pc.getInstance(new Person()); person.print(); } }
四 输出结果
----Before print------
Person's print method!
----After print-------
可以看到在执行Person类中的print方法前后,加入了新的逻辑,实现了一个简单的动态代理。