Java动态代理机制——Cglib

上一篇说过JDK动态代理机制,只能代理实现了接口的类,这就造成了限制。对于没有实现接口的类,我们可以用Cglib动态代理机制来实现。

Cglib是针对类生成代理,主要是对用户类生成一个子类。因为有继承,所以Cglib也有个限制,就是不能代理用final修饰的类。

定义一个具体实现类Person:

package wang.dao;

public class Person {
	
	public void eat()
	{
		System.out.println("吃的方法。。。");
	}
	
	public void sleep()
	{
		System.out.println("睡的方法。。。");
	}
	
	public void study()
	{
		System.out.println("学的方法。。。");
	}
}

定义一个Cglib代理处理器:

package wang.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 MyCglibProxy implements MethodInterceptor{
	
	private Object target;//定义被代理的对象
	
	public Object getInstance(Object target)
	{
	  	this.target = target;
           	Enhancer enhancer = new Enhancer();  
        		enhancer.setSuperclass(this.target.getClass());  
        		enhancer.setCallback(this);  
        		return enhancer.create();
	}
	
	@Override
	public Object intercept(Object object, Method method, Object[] args,  
            MethodProxy proxy) throws Throwable {
		//在这里我们可以调用其他方法(切面编程的思想),这里我们只写输出语句
		System.out.println("代理前执行的方法。。。");
		
		proxy.invokeSuper(object, args);
		
		System.out.println("代理后执行的方法。。。");
		
		return null;
	}

}

定义测试类:

package wang.test;

import wang.dao.Person;
import wang.proxy.MyCglibProxy;

public class CglibTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		MyCglibProxy proxy = new MyCglibProxy();
		Person person = (Person) proxy.getInstance(new Person());
		person.eat();
		person.sleep();
		person.study();

	}

}




 

 

posted @ 2014-05-08 11:59  &王先生  阅读(199)  评论(0编辑  收藏  举报