java动态代理生成的类为啥非要继承Proxy导致不能实现class的代理
JDK的动态代理只允许动态代理接口是设计使然,因为动态代理一个类存在一些问题。在代理模式中代理类只做一些额外的拦截处理,实际处理是转发到原始类做的。这里存在两个对象,代理对象跟原始对象。如果允许动态代理一个类,那么代理对象也会继承类的字段,而这些字段是实际上是没有使用的,对内存空间是一个浪费。因为代理对象只做转发处理,对象的字段存取都是在原始对象上处理。更为致命的是如果代理的类中有final的方法,动态生成的类是没法覆盖这个方法的,没法代理,而且存取的字段是代理对象上的字段,这显然不是我们希望的结果。spring aop框架就是这种模式。
■网友
个人觉得是java不希望你直接代理类,因为直接代理类相比接口会消耗大量的内存,所以通过继承Proxy类来限制你
■网友
看了这么多分析的,我觉得这样设计的初衷就是为了套用代理模式模板和基于接口编程规范的
静态代理中就是实现接口,再在代理类set进实现类的引用,调用真正代理的方法
就算他不继承Proxy,也不会继承被代理的实现类 ,而是必须有一个代理类的接口去实现它,这是设计的初衷
■网友
我觉得除了@gavin的回答,应该还有一点:如果实现class的代理,还有对原始类和代理类之间的状态同步,这个也是很坑爹的,尤其是代理的方法涉及的字段可能被频繁修改,最终可能会影响效率。
■网友
其实,问题我读了很多遍,基本没看太明白。不知道 题主用的是哪个版本,在我书写的java动态代理中使用的是实现InvocationHandler接口在invoke方法中写入执行代理的动作完成代理。例如
public Object getService(Class\u0026lt;?\u0026gt; obj){ //传入需要被代理的接口
\t\tInvocationHandler handler=new NginxProxy(obj);//InvocationHandler 的实现类 ,需要代理的动作
\t\treturn Proxy.newProxyInstance(obj.getClassLoader(), new Class{obj}, handler);
\t}
newProxyInstance返回值是object类型的 可以直接转换为被代理的接口类型,如代码:
TestInterface n=(TestInterface)ClientService.getInstance().getService(TestInterface.clas);
【java动态代理生成的类为啥非要继承Proxy导致不能实现class的代理】 从而实现在不对接口TestInterface进行实现而调用代理TestInterface接口的执行逻辑,这种方法常被用于rpc协议中的客户端框架。基本上实现的就是代理了一个类。
推荐阅读
- 马蓉|马蓉又有新动态!“消失”107天后晒清纯美照,粉丝都没认出来
- dart这编程语言现在发展怎么样了,语法与Java,c#很相似,甚至更简洁
- 在水产公司做搬运工的弟弟感染后,住同一小区的姐姐也检出阳性!最新疫情动态…
- 电视盒子能用代理吗
- 咋自己发布网站
- 同一款手游为啥会有多家代理
- 网游职业玩家咋赚钱的
- Java工程师和C++工程师在工作上有啥区别哪个更适合自身发展
- 车动态|吉利星瑞的颠覆之路,离不开稳扎稳打
- 动态规划能得到一类问题的最优解,比如背包问题用动态规划来解决,怎样证明这个解就是相对应问题的最优解呢
