上一篇说过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();
}
}