美文网首页
为何jdk动态代理必须有接口,不支持仅实现类的代理

为何jdk动态代理必须有接口,不支持仅实现类的代理

作者: 0爱上1 | 来源:发表于2018-02-08 10:49 被阅读2121次

查看jdk的动态代理源码发现:

    动态代理实际上是程序在运行中,根据被代理的接口来动态生成代理类的class文件,并加载class文件运行的过程,通过反编译被生成的$Proxy0.class文件发现:

    class类定义为:

    public final class $Proxy0 extends Proxy implements Interface {

        public $Proxy0(InvocationHandler paramInvocationHandler) {  

            super(paramInvocationHandler);  

          } 

        ...

        ...

        // 该方法为被代理接口的业务方法,代理类都会自动生成相应的方法,里面去执行invocationHandler 的invoke方法。

        public final void sayHello(String paramString) {  

            try {  

                this.h.invoke(this, m3, new Object[] { paramString });  

                return;  

            }  

            catch (Error|RuntimeException localError) {  

                throw localError;  

            }  

            catch (Throwable localThrowable) {  

                throw new UndeclaredThrowableException(localThrowable);  

            }  

      } 

    }

    由于java的单继承,动态生成的代理类已经继承了Proxy类的,就不能再继承其他的类,所以只能靠实现被代理类的接口的形式,故JDK的动态代理必须有接口。

另外,为何调用代理类的方法就会自动进入InvocationHandler 的 invoke()方法呢?

其实是因为在动态代理类的定义中,构造函数是含参的构造,参数就是我们invocationHandler 实例,而每一个被代理接口的方法都会在代理类中生成一个对应的实现方法,并在实现方法中最终调用invocationHandler 的invoke方法,这就解释了为何执行代理类的方法会自动进入到我们自定义的invocationHandler的invoke方法中,然后在我们的invoke方法中再利用jdk反射的方式去调用真正的被代理类的业务方法,而且还可以在方法的前后去加一些我们自定义的逻辑。比如切面编程AOP等。

相关文章

  • spring aop

    JDK动态代理和CGLib代理 JDK的代理代理类 被代理接口 被代理实现类 启动类: jdk的动态代理是针对接口...

  • Java代理(jdk静态代理、动态代理和cglib动态代理)

    jdk静态代理 jdk动态代理 jdk动态代理的业务类必须实现接口 业务类的实现类 代理类的生成 cglib动态代...

  • Java中3种代理总结

    1、JDK静态代理 业务接口 接口的实现类 代理类,实现接口,并扩展实现类的功能 2、JDK动态代理 业务接口 实...

  • JDK动态代理和CGLIB动态代理

    如果目标类实现接口,采用JDK动态代理;如果目标类没有实现接口,采用CGLIB动态代理 一.JDK动态代理 总结1...

  • 动态代理-jdk代理实现原理

    动态代理-jdk代理实现原理 JDK中提供了一个Proxy类用于实现动态代理,JDK的动态代理是基于接口实现的,被...

  • CGlib动态代理

    动态代理比起静态代理方便的多,但是jdk动态代理实现必须通过接口,如果要代理一个没有接口的类jdk动态就无法实现了...

  • AOP底层实现(了解)

    两种代理机制: JDK 的动态代理:针对实现了接口的类产生代理。 Cglib 的动态代理:针对没有实现接口的类产生...

  • Java Spring中的动态代理cglib

    总结 JDK的动态代理和 Spring中的动态代理cglib区别 JDK 的动态代理 :针对实现了接口的类产生代理...

  • java动态代理

    jdk动态代理 jdk自带,必须有接口的类才可以使用该代理 使用 cglib 无需接口都可使用该代理 使用

  • 动态代理

    jdk的动态代理: 注意jdk的动态代理要求被代理的类必须实现了接口,我们先定义被代理的主类MyServer: 首...

网友评论

      本文标题:为何jdk动态代理必须有接口,不支持仅实现类的代理

      本文链接:https://www.haomeiwen.com/subject/jrazzxtx.html