cglib简单的小实例

来源:互联网 发布:金桥软件公园 编辑:程序博客网 时间:2024/05/03 20:07

cglib和Jdk的动态代理相比,它的优点是目标类不用实现一个接口。


代码实现:


目标类

package cglib;public class ClassHasNoInterface {public void  method(){System.out.println("建立自己的知识体系还是很重要的,尽管觉得麻烦");}public void function(){System.out.println("如果我只停留在使用的别人开发的工具阶段,那么再过5年我也对不起程序员这个称呼");}}

代理类

package cglib;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 CglibTs implements MethodInterceptor{private Enhancer enhancer = new Enhancer();public Object getProxy(Class clazz){//生成指定类对象的子类,也就是重写类中的业务函数,在重写中加入intercept()函数而已。enhancer.setSuperclass(clazz);//这里是回调函数,enhancer中肯定有个MethodInterceptor属性。//回调函数是在setSuperclass中的那些重写的方法中调用---猜想enhancer.setCallback(this);//创建这个子类对象return enhancer.create();}public Object intercept(Object obj, Method method, Object[] args,MethodProxy proxy) throws Throwable {System.out.println(method.getName()+"执行之前做一些准备工作");//一不小心写成下面被注释一行代码了。 StackOverflowError//Object result = method.invoke(obj, args); 想不通Object result = proxy.invokeSuper(obj,args);System.out.println(method.getName()+"执行之后做一些准备的工作");return result;}}

测试类:

package cglib;public class MainTest {public static void main(String[] args) {CglibTs ct = new CglibTs();ClassHasNoInterface chni = (ClassHasNoInterface) ct.getProxy(ClassHasNoInterface.class);chni.method();chni.function();}}

这里对代理类中的method.invoke()出现内存溢出感到疑惑,会不是method是子类中的方法,形成了一个递归(死循环)造成的?等某天想看了在研究其中的源码,现在先放着。

原创粉丝点击