当前位置:首页 > java基础 > 正文内容

动态代理

淙嶙6年前 (2020-07-20)java基础1653

一、实现动态代理的方式:

  • jdk动态代理
  • CGlib动态代理
  • javassist动态代理

CGlib底层实现依赖于ASM, javassist自成一派. 由于ASM和javassist需要程序员直接操作字节码,导致使用技术门槛较高,JDK底层使用反射,但是最终也是操作字节码. Dubbo采用的javassist代理,动态的在内存当中生成所代理的字节码,来完成代理的功能.

二、JDK动态代理

需要的必要条件: 该类需要实现一个接口,这个接口就是JDK动态代理的基础.

public interface Person{
    void speak();
    @MethodName("run")
    void run();
}

创建需要代理的类:

public class Wang implements Person {
    @Override
    public void speak() {
        System.out.println("You are so nice!");
    }

    @Override
    public void run() {
        System.out.println("Running is good for you!");
    }
}

创建代理类: 1) 代理类实现InvocationHandler接口 2) Proxy.newInstance() 方法创建代理类 3) 实现invoke方法

public class TargetProxyA implements InvocationHandler{
    private Object target;

    public TargetProxyA(Object target) {
        this.target = target;
    }

    public static Object getInstance(Object target) {
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),
                new TargetProxyA(target));
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        before();
        return method.invoke(target, args);
        after();
    }

    private void before(){
         System.out.println("操作前处理!");
    }

    private void after(){
         System.out.println("后续处理");
    }
}

调用代理

public class Client{
    public static void main(String[] args) {
        Person personWang = (Person) TargetProxyA.getInstance(new Wang());
        personWang.speak();
   }
}

相关文章

JVM总结

JVM总结

花费了一周时间对深入理解Java虚拟机做了个回顾,对原来的知识做了个补充,直到慢慢的阅读中,才发现有好多东西已经忘了。把所阅读的通过一个思维导图做个了简单的总结,时间仓促,还有不全。待十一节后继续补充...

ConcurrentHashMap源码解读

ConcurrentHashMap源码解读

/* * Written by Doug Lea with assistance from members of JCP JSR-166 * Expert Group and released...

Java中的为什么只有值传递

Java中的为什么只有值传递

1.基本类型和引用类型在内存中的保存Java中数据类型分为两大类,基本类型和对象类型。相应的,变量也有两种类型:基本类型和引用类型。基本类型的变量保存原始值,即它代表的值就是数值本身;而引用类型的变量...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。