Java 动态代理
Spring中的AOP的基础就是动态代理,动态代理也是代理模式的一种实现。 Java中动态代理的实现分为两种:JDK的动态代理和cglib的动态代理。
-
JDK的动态代理 步骤如下:首先定义一个委托类和接口 然后定义一个类去实现 InvocationHandler 接口, 再生成代理对象。 主要涉及 Proxy类(通过这个生成代理类)和InvocationHandler类
public interface Subject { void request(String message); }
public class RealSubject implements Subject{
@Override public void request(String message) { System.out.println(message); } }
public class ProxyHandler implements InvocationHandler {
private Subject subject; public ProxyHandler(Subject subject) { this.subject = subject; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws InvocationTargetException, IllegalAccessException { System.out.println("===before==="); Object result = method.invoke(subject, args); System.out.println("===after==="); return result; } public static void main(String[] args) { RealSubject realSubject = new RealSubject(); ProxyHandler proxyHandler = new ProxyHandler(realSubject); Subject proxySubject = (Subject) Proxy.newProxyInstance(RealSubject.class.getClassLoader(), RealSubject.class.getInterfaces(), proxyHandler); proxySubject.request("dididi"); } }
-
CGLIB动态代理
jdk中的动态代理只能针对接口,如果一个类没有实现接口就不行,cglib可以解决这个问题。cglib通过继承来进行动态代理。所以类不能是final的
Written on August 6, 2018