JDK的动态代理大家都很熟悉,都可以使用,但是大家有没有深思过一个问题,为什么JDK的动态代理只能使用接口呢?想必有些人看到这个问题后会一头雾水,小编带你揭开这个问题的本质。答案很简单,但并不简单。JDK的动态代理之所以只能通过接口实现,是因为newProxyInstance在运行时会在内部缓存表单,通过字节码生成一个代理类。这个代理类默认继承了Proxy类,同时实现了我们传入的一堆接口;由于Java是单继承的,JDK动态代理只能代理接口,接口可以实现多个,类只能继承实现一个。例如,我们使用动态代理示例如下:Foof=(Foo)Proxy.newProxyInstance(Foo.class.getClassLoader(),newClass>[]{Foo.class},handler);上面代码运行时,默认会在内存中通过字节码生成一个动态代理类,大致如下:publicclass$Proxy1extendsProxyimplementsFoo{...}这就是JDK动态代理只能通过接口实现的原因。深入思考分析为什么要从动态代理入口入手,即Proxy.newProxyInstance(ClassLoaderloader,Class[]interfaces,InvocationHandlerh),下面是它的源码://JDK创建一个动态代理proxypublicstaticObjectnewProxyInstance(ClassLoaderloader,Class>[]interfaces,InvocationHandlerh)throwsIllegalArgumentException{...//KeyfinalClass>[]intfs=interfaces.clone();...//生成增强动态代理ClassClass>cl=getProxyClass0(loader,intfs);//创建增强型动态代理类实例对象try{...finalConstructor>cons=cl.getConstructor(constructorParams);...returncons.newInstance(newObject[]{h});}catch(IllegalAccessException|InstantiationExceptione){...}}有一个关键语句Classcl=getProxyClass0(loader,intfs);上述代码中,源码如下:,Class>...interfaces){if(interfaces.length>65535){thrownewIllegalArgumentExceptionon("interfacelimitexceeded");}//proxyClassCache是??Proxy的一个静态变量,它是一个WeakCache类,//里面封装了两个类KeyFactory和ProxyClassFactory//Key!!!ProxyClassFactory的apply方法本质上调用了returnproxyClassCache.get(loader,interfaces);}接上上面的代码,我们继续看ProxyClassFactory,如下:privatestaticfinalclassProxyClassFactoryimplementsBiFunction
