动态道理分为 cglib 和jdk 我们先看jdk public interface OrderService { /** *抽象的共同方法 */ void order() throws Throwable; }
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class JdkInvocationHandler implements InvocationHandler { /** * 被代理的对象 ,目标代理对象 */ private Object target; public JdkInvocationHandler(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("---执行日志代码START"+proxy.getClass().toString()); Object result = method.invoke(target, args); System.out.println("---执行日志代码END"); return result; } /** * 使用jdk动态代理创建代理类 * * @param <T> * @return */ public <T> T getProxy() { return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } }
Cglib 方式 引入 pom
<dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.2.12</version> </dependency> import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; public class CglibMethodInterceptor implements MethodInterceptor { @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println(">>>Cglib 日志手机START---"); methodProxy.invokeSuper(o,objects); System.out.println(">>>Cglib 日志手机END---"); return null; } }
测试代码
public class client { public static void main(String[] args) throws Throwable { /** * 动态代理 jdk的动态代理为什么用父类进行接受 , 因为生成的代理类一般都是接口形式,代理类必须实现接口 */ System.getProperties().put("sum.misc.ProxyGenerator.saveGeneratedFiles","true"); OrderService orderService = new JdkInvocationHandler(new OrderServiceImpl()).getProxy(); orderService.order(); /** * 动态代理 Cglib方式 */ CglibMethodInterceptor cglibMethodInterceptor = new CglibMethodInterceptor(); Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(OrderServiceImpl.class); enhancer.setCallback(cglibMethodInterceptor); OrderServiceImpl orderService = (OrderServiceImpl) enhancer.create(); orderService.order(); } }