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