现在的位置: 首页 > 综合 > 正文

cglib简单的小实例

2013年12月05日 ⁄ 综合 ⁄ 共 1362字 ⁄ 字号 评论关闭

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是子类中的方法,形成了一个递归(死循环)造成的?等某天想看了在研究其中的源码,现在先放着。

抱歉!评论已关闭.