关于JDK动态代理

简介: 关于JDK动态代理的一些理解

声明:这里我没有看源码,全凭代码操作和测试结果的理解。

JDK动态代理,主要包括两个组成部分,一个是代理逻辑,一个是代理实体

作为代理逻辑类,必须要实现InvocationHandler接口,因为要是不实现此接口,就没有办法利用Proxy的方法

public static Object newProxyInstance(ClassLoader loader,
                                      Class<?>[] interfaces,
                                      InvocationHandler h)
                               throws IllegalArgumentException

来生成代理实体。代理实体一般会被强制转化为相应的接口类型,以调用相应的方法,执行代理逻辑中的内容。

并且因为代理逻辑类里是代理实体具体要执行的操作,所以一般都要传入被代理实体,来执行相关的逻辑。

ProxyLogic(代理逻辑)实现InvocationHandler接口,为生成代理实体做准备。

public class ProxyLogic implements InvocationHandler {
   
    private Object target;
    //target为被代理实体
    public ProxyLogic(Object target) {
   
        this.target=target;
    }
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
   
        /* method.invoke(proxy,args); *///这里出现了死循环,不太理解,还望大佬指教
        System.out.println("代理逻辑的载体!");
        /* method.invoke(target); *///Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments
        Object invokeResult = method.invoke(target,args); //不报错
        /* method.invoke(target,args,args); *///Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments
        return invokeResult;
    }

}

HelloImp类(被代理实体)实现了如下接口:



public interface Say {
   
    void say(String str);
}


public interface Say {
   
    void say(String str);
}

public interface SayMore {
   
    void say(String str1,String str2);
}


public class HelloImp implements Hello,Say,SayMore {
   

    @Override
    public void sayHello() {
   
        System.out.println("世界你好!");
    }

    @Override
    public void say(String str) {
   
        System.out.println("你说的是:"+str);
    }

    @Override
    public void say(String str1, String str2) {
   
        System.out.println("你说的是:"+str1+"和"+str2);

    }


}

然后是测试类:


public static void main(String[] args) {
   
        Hello hello = (Hello)Proxy.newProxyInstance(HelloImp.class.getClassLoader(), HelloImp.class.getInterfaces(),new learn.ProxyLogic(new HelloImp()));
        hello.sayHello();
        Say say = (Say)Proxy.newProxyInstance(HelloImp.class.getClassLoader(), HelloImp.class.getInterfaces(),new learn.ProxyLogic(new HelloImp()));
        say.say("你好");
        SayMore sayMore = (SayMore)Proxy.newProxyInstance(HelloImp.class.getClassLoader(), HelloImp.class.getInterfaces(),new learn.ProxyLogic(new HelloImp()));
        sayMore.say("你好","世界");
    }

输出结果:

代理逻辑的载体!
世界你好!
代理逻辑的载体!
你说的是:你好
代理逻辑的载体!
你说的是:你好和世界

所以可以理解,invoke()中的Object[] args参数,之所以要使用数组,就是为了适应被代理方法的参数个数。

初学者,还望读者老爷多指教

目录
相关文章
|
4月前
|
缓存 Java 数据库连接
分析JDK动态代理的实现
分析JDK动态代理的实现
39 0
|
7月前
|
Java
jdk动态代理实现原理
jdk动态代理实现原理
36 0
|
1月前
|
Java 程序员 API
浅谈JDK动态代理
浅谈JDK动态代理
31 1
|
2月前
|
设计模式 Java API
[Java]静态代理、动态代理(基于JDK1.8)
本篇文章主要是对静态代理和动态代理实现思路的简述,以示例为主,少涉及理论。 如果文中阐述不全或不对的,多多交流。
54 1
[Java]静态代理、动态代理(基于JDK1.8)
|
2月前
|
设计模式 安全 Java
深入理解Spring Boot AOP:CGLIB代理与JDK动态代理的完全指南
深入理解Spring Boot AOP:CGLIB代理与JDK动态代理的完全指南
328 1
|
3月前
|
Java 数据安全/隐私保护
【面试问题】JDK 动态代理与 CGLIB 区别?
【1月更文挑战第27天】【面试问题】JDK 动态代理与 CGLIB 区别?
|
3月前
|
Java Linux iOS开发
Spring5源码(27)-静态代理模式和JDK、CGLIB动态代理
Spring5源码(27)-静态代理模式和JDK、CGLIB动态代理
23 0
|
3月前
|
Java
JDK动态代理笔记整理
JDK动态代理笔记整理
|
8月前
|
设计模式 Java 数据安全/隐私保护
设计模式之代理模式(jdk和cglib、手撕源码、自创动态代理) 1
设计模式之代理模式(jdk和cglib、手撕源码、自创动态代理)
57 0
|
9月前
|
Java Maven
JDK动态代理和CGLIB动态代理的区别及实例
JDK动态代理和CGLIB动态代理的区别及实例
126 0