JDK动态代理
- 只能代理实现了接口的类
- 没有实现接口的类不能实现JDK的动态代理
CGLIB动态代理
- 针对类来实现代理的
- 对指定目标类产生一个子类,通过方法拦击技术拦截所有父类方法的调用
使用Cglib实现动态代理
package com.imooc.cglib; public class Train { public void move(){ System.out.println("火车行驶中"); } }
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 CglibProxy implements MethodInterceptor { private Enhancer enhancer = new Enhancer(); public Object getProxy(Class clazz){ //设置创建子类的类 enhancer.setSuperclass(clazz); enhancer.setCallback(this); return enhancer.create(); } /* * 拦截所有目标类方法的调用 * obj:目标类的实例 * m:目标方法的反射对象 * args:方法的参数 * proxy:代理类的实例 * * (non-Javadoc) * @see net.sf.cglib.proxy.MethodInterceptor#intercept(java.lang.Object, java.lang.reflect.Method, java.lang.Object[], net.sf.cglib.proxy.MethodProxy) */ @Override public Object intercept(Object obj, Method m, Object[] args, MethodProxy proxy) throws Throwable { // TODO Auto-generated method stub System.out.println("日志开始"); //代理类调用父类的方法 proxy.invokeSuper(obj, args); System.out.println("日志结束"); return null; }
package com.imooc.cglib; public class Client { public static void main(String[] args) { CglibProxy proxy = new CglibProxy(); Train t = (Train)proxy.getProxy(Train.class); t.move(); } }
时间: 2024-10-24 01:46:11