• Java的动态代理Proxy.newProxyInstance


    本文参考:java动态代理Proxy.newProxyInstance-CSDN博客

    一、动态代理定义

    利用Java的反射技术,在运行期间创建可以实现某些给定接口的新类,称为动态代理类。

    此处代理的接口(Interfaces),不是类(Class)。

    动态代理是因为在运行时才知道具体的类的实现(接口对应不同的实现,动态调用)。

    二、动态代理JDK的实现方法

    1. public static Object newProxyInstance(ClassLoader loader,
    2. Class[] interfaces,
    3. InvocationHandler h)
    4. throws IllegalArgumentException

    newProxyInstance方法有三个参数:

    (1)loader:用哪个类加载器去加载代理对象

    (2)interfaces:动态代理类需要实现的接口

    (3)InvocationHandler:动态代理方法在执行时,会调用此处的invoke方法去执行

    invoke的原型:

    1. new InvocationHandler() {
    2.     @Override
    3.     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    4.     }
    5. }

    1)proxy:就是代理对象,newProxyInstance方法的返回对象

    2)method:调用的方法,此处为被代理对象的方法

    3)args:方法中的参数,此处为被代理对象的方法的参数

    invoke会根据被代理对象的方法个数被执行多次。

    三、示例

    (1)定义接口

    1. public interface IVehical {
    2. void run();
    3. void show();
    4. }

    (2)实现接口

    1. public class Car implements IVehical {
    2. @Override
    3. public void run() {
    4. System.out.println("Car会跑");
    5. }
    6. @Override
    7. public void show() {
    8. System.out.println("Car show...");
    9. }
    10. }

    (3)动态代理

    1. public class ProxyTest {
    2. public static void main(String[] args) {
    3. IVehical car = new Car();
    4. Object beanProxy = Proxy.newProxyInstance(
    5. car.getClass().getClassLoader(),
    6. car.getClass().getInterfaces(),
    7. new InvocationHandler() {
    8. @Override
    9. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    10. if(method.getName().equals("run")){
    11. System.out.println("---------before---------");
    12. Object result = method.invoke(car, args);
    13. System.out.println("---------after---------");
    14. return result;
    15. }else{
    16. Object result = method.invoke(car, args);
    17. return result;
    18. }
    19. }
    20. }
    21. );
    22. ((IVehical)beanProxy).run();
    23. ((IVehical)beanProxy).show();
    24. }
    25. }

    (4)执行结果

    ---------before---------
    Car会跑
    ---------after---------
    Car show...
     

  • 相关阅读:
    论文阅读 6 | Bayesian Meta-Learning for the Few-Shot Setting via Deep Kernels
    设计模式:适配器模式(论如何把鼠头适配加工成鸭脖)
    牛客2022暑期集训第一场C题 Grab the Seat! 题解
    [附源码]java毕业设计食堂线上点餐系统
    MySQL中CONCAT()函数拼接出现NULL的问题
    如何在银行系统中做批量测试~
    批量循环查询
    使用npm发布自己的组件库
    idea中导入eclipse的javaweb项目——tomact服务(保姆级别)
    自建图床实现typora图片上传
  • 原文地址:https://blog.csdn.net/benben044/article/details/134521374