JDK动态代理为什么只能代理有接口的类?

简介: JDK动态代理为什么只能代理有接口的类?

为什么只能代理有接口的类?


是因为JDK动态代理本身机制决定的,首先在java里面动态代理是

Proxy.newProxyInstance()这个方法来实现的,它需要传入被动态代理的一个接口类,还是取决于JDK动态代理的的一个底层实现,JDK动态代理会在程序运行期间,去动态生产一个代理类,叫$ProxyO,那么这个动态生成的代理类会去继承一个 java.lang.reflect.Proxy这样一个类,同时还会去实现被代理类的接口,在java里面不支持多种继承的,而每个动态代理都继承一个Proxy,所以就导致的JDK里面的动态代理只能代理接口,而不能代理实现类



JDK动态代理可以代理类吗


Proxy这个类只是保存了动态代理的一个处理器叫InvocationHandler如果不抽出来,直接设置在$ProxyO这个动态代理的里面我认为也是可以的,如果这么去实现的话,就可以针对类做动态的代理了,作者为什么这么设计


可以这么设计


1.动态代理本身的使用场景或者需求,只是对原始实现一个拦截,然后去做一些功能的增强或者扩展,展而实际的开发模式,都是基于面向接口来开发的,所以基于接口来实现动态代理,从需求和场景都是吻合的,当然确实会存在一些没有实现接口的一些类,那么这个我们要去实现动态代理,那么jdk就显然无法满足的


2.在java里面,类的技能关系的设计,更多的是考虑到共性能力的抽象,从而提高代码的重用性和扩展性,而动态代理其实也在做这样的事情,它封装了动态代理的生成和抽象逻辑,以及判断一个类是否是动态代理类,以及InvocationHandler的一个持有等等,那么我们这个抽象逻辑放在Proxy这个父类里面,很显然也是一个比较正常的一个思路



还可以怎么实现


我们可以选择cglib动态代理,它会动态生成一个,被代理类的子类,子类重写父类非final修饰的方法,在子类中拦截父类的所有方法的一个调用,从而去实现动态代理



相关文章
|
2天前
|
前端开发 算法 安全
JavaEE企业级开发中常用的JDK7和JDK8的时间类
JavaEE企业级开发中常用的JDK7和JDK8的时间类
17 3
|
13天前
日期类(jdk8之前)
日期类(jdk8之前)
|
19天前
|
Java
JavaSE——JDk8新特性(1/2):Lambda表达式(具体实现、函数式接口、简化setAll、Comparator),Lambda表达式的省略写法
JavaSE——JDk8新特性(1/2):Lambda表达式(具体实现、函数式接口、简化setAll、Comparator),Lambda表达式的省略写法
18 1
|
1天前
|
Java
JDK 1.8 函数接口(收藏用)
JDK 1.8 函数接口(收藏用)
4 0
|
1天前
|
设计模式 Java 程序员
java动态代理(JDK和cglib)
java动态代理(JDK和cglib)
|
2天前
|
缓存 Java Maven
JDK 动态代理
JDK 动态代理
3 0
|
7天前
|
Java Spring
深入解析Spring源码,揭示JDK动态代理的工作原理。
深入解析Spring源码,揭示JDK动态代理的工作原理。
10 0
|
1月前
|
Java
【JAVA进阶篇教学】第四篇:JDK8中函数式接口
【JAVA进阶篇教学】第四篇:JDK8中函数式接口
|
1月前
|
设计模式 Java
JDK动态代理
JDK动态代理
|
1月前
|
安全 Java 开发者
jdk1.8 Optional类从入门到实战
Optional 类是 Java 8 引入的一个容器类,用于表示一个值存在或不存在。其在 java.util 包中,主要目的是为了解决 Java 程序中广泛存在的空指针异常(NullPointerException)问题,同时提供了一种更优雅的方式来处理可能为 null 的对象。 在 Java 8 之前,处理 null 值往往依赖于显式的 null 检查,这种方式不仅增加了代码的复杂度,而且容易出错。Optional 类提供了一种更好的解决方案,通过封装可能为 null 的值,强制开发者显式地处理值存在或不存在的情况,从而减少在运行时出现 NullPointerException 的可能性。
31 3