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();



	}



}




 

 

你可能感兴趣的:(java动态代理)