Java 动态代理

Spring中的AOP的基础就是动态代理,动态代理也是代理模式的一种实现。 Java中动态代理的实现分为两种:JDK的动态代理和cglib的动态代理。

  1. 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");
     }  }
    
  2. CGLIB动态代理

jdk中的动态代理只能针对接口,如果一个类没有实现接口就不行,cglib可以解决这个问题。cglib通过继承来进行动态代理。所以类不能是final的

Written on August 6, 2018