社区
Java EE
帖子详情
为什么动态代理只能基于接口?
xushaoqian911
2007-06-05 02:42:04
为什么动态代理只能基于接口?
为什么不能用于没有接口的类?
返回一个Object的类型我就满足了啊!
Object o=hand.c(new hello());
谁能结合编译原理说个透切?
或者不需要深入到编译层就能解释这个问题?
...全文
925
18
打赏
收藏
为什么动态代理只能基于接口?
为什么动态代理只能基于接口? 为什么不能用于没有接口的类? 返回一个Object的类型我就满足了啊! Object o=hand.c(new hello()); 谁能结合编译原理说个透切? 或者不需要深入到编译层就能解释这个问题?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
18 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
qqq514058070
2011-11-02
打赏
举报
回复
opentan
2010-12-12
打赏
举报
回复
最近也正在研究,我也没搞明白,jdk这样设计的原理。
但是jdk动态代理可以代理final类,而cglib不能代理final类。
至于性能方面,正在研究中。
a569030907
2009-09-02
打赏
举报
回复
学习
xushaoqian911
2007-06-07
打赏
举报
回复
查了N多资料发现jdk动态代理和cglib一样底层都是用了字节码生成技术.
下面是一个反编译后的动态代理类
public final class TempProxy extends Proxy
implements Temp{
private static Method m4;
private static Method m2;
private static Method m0;
private static Method m3;
private static Method m1;
public TempProxy(InvocationHandler invocationhandler) {
super(invocationhandler);
}
public final void Run() {
try {
h.invoke(this, m4, null);
return;
}
catch(Error _ex) { }
catch(Throwable throwable) {
throw new UndeclaredThrowableException(throwable);
}
}
public final String toString(){
try{
return (String)h.invoke(this, m2, null);
}
catch(Error _ex) { }
catch(Throwable throwable) {
throw new UndeclaredThrowableException(throwable);
}
return "";
}
public final int hashCode() {
try {
return ((Integer)h.invoke(this, m0, null)).intValue();
}
catch(Error _ex) { }
catch(Throwable throwable){
throw new UndeclaredThrowableException(throwable);
}
return 123;
}
public final void Talk(){
try{
h.invoke(this, m3, null);
return;
}
catch(Error _ex) { }
catch(Throwable throwable) {
throw new UndeclaredThrowableException(throwable);
}
}
public final boolean equals(Object obj) {
try {
return ((Boolean)h.invoke(this, m1, new Object[] {
obj
})).booleanValue();
}
catch(Error _ex) { }
catch(Throwable throwable) {
throw new UndeclaredThrowableException(throwable);
}
return false;
}
static{
try{
m4 = Class.forName("Temp").getMethod("Run", new Class[0]);
m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]);
m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]);
m3 = Class.forName("Temp").getMethod("Talk", new Class[0]);
m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[] {
Class.forName("java.lang.Object")
});
}
catch(NoSuchMethodException nosuchmethodexception) {
throw new NoSuchMethodError(nosuchmethodexception.getMessage());
}
catch(ClassNotFoundException classnotfoundexception) {
throw new NoClassDefFoundError(classnotfoundexception.getMessage());
}
}
}
xushaoqian911
2007-06-06
打赏
举报
回复
sun以后会不会为java增加基于类的动态代理功能呢?
xushaoqian911
2007-06-06
打赏
举报
回复
想知道答案的都来帮忙顶下,谢谢了
ker79
2007-06-06
打赏
举报
回复
学习
xushaoqian911
2007-06-06
打赏
举报
回复
csdn就没有能回答这个问题的人吗?
顶下
shengli_liao
2007-06-05
打赏
举报
回复
我也很想知道为什么,共同学习
xushaoqian911
2007-06-05
打赏
举报
回复
而且父类的方法可能不会在程序中用到
xushaoqian911
2007-06-05
打赏
举报
回复
我是这样理解的:动态代理要代理被代理对象的所有方法,如果对象是类,则要将它的所有父类的方法代理,比如Object。。。,还有的类存在final 方法,这样动态代理就失败了。
------考虑到父类的方法,这是个问题,但我想这是可以解决的一个问题,ruby就可以在程序中指定哪几个方法被代理的。
技术开发到天荒地老
2007-06-05
打赏
举报
回复
我是这样理解的:动态代理要代理被代理对象的所有方法,如果对象是类,则要将它的所有父类的方法代理,比如Object。。。,还有的类存在final 方法,这样动态代理就失败了。
xushaoqian911
2007-06-05
打赏
举报
回复
代理对象可以实现一个或多个接口,但是不能实现类。
因为代理类没有可以访问的名称,它们不能有构造函数。
-------我觉的代理类不一定要实现接口啊,我可以完全用反射来代替啊.
机制不同,cglib 可以代理所有类
-------我知道cglib 可以代理所有类,我想讨论的是动态代理为什么不能代理类?
insiku
2007-06-05
打赏
举报
回复
机制不同
cglib 可以代理所有类
技术开发到天荒地老
2007-06-05
打赏
举报
回复
根据通用的设计原则:接口定义类型、类定义实现,代理对象可以实现一个或多个接口,但是不能实现类。因为代理类没有可以访问的名称,它们不能有构造函数,所以它们必须由工厂创建。具体参看:http://www.ibm.com/developerworks/cn/java/j-jtp08305.html
xushaoqian911
2007-06-05
打赏
举报
回复
up
xushaoqian911
2007-06-05
打赏
举报
回复
是代理类根本不可能实现呢?
还是没必要实现?
或是有别的代替的办法呢?
还是?????
namelijian
2007-06-05
打赏
举报
回复
学习
为什么JDK
动态代理
只能
代理
接口
?
为什么JDK
动态代理
只能
代理
接口
?
JDK
动态代理
为什么必须要基于
接口
?
原创:微信公众号 码农参上,欢迎分享,转载请保留出处。 前几天的时候,交流群里的小伙伴抛出了一个问题,为什么JDK的
动态代理
一定要基于
接口
实现呢? 好的安排,其实要想弄懂这个问题还是需要一些关于代理和反射的底层知识的,我们今天就盘一盘这个问题,走你~ 一个简单的例子 在分析原因之前,我们先完整的看一下实现jdk
动态代理
需要几个步骤,首先需要定义一个
接口
: public interface Worker { void work(); } 再写一个基于这个
接口
的实现类: public class .
为什么JDK
动态代理
只能
代理
接口
,不能直接代理类?CGlib为什么可以代理类?
在?撸个问题。一、JDK
动态代理
与CGlib
动态代理
二、为什么JDK
动态代理
只能
代理
接口
,不能直接代理类?(一)简单的实现JDK
动态代理
三、CGlib为什么可以代理类?四、总结五、参考: 一、JDK
动态代理
与CGlib
动态代理
众所周知,Spring会基于代理的类去动态的选择使用JDK创建代理对象还是CGLIB(当然也可以配置全都使用CGlib),这取决于被代理的对象是类还是
接口
。 java
动态代理
是利用反射机制生成一个实现代理
接口
的匿名类,在调用具体方法前调用InvokeHandler来处理。 CGli
JDK
动态代理
为什么
只能
代理有
接口
的类?
嗯,这个问题的核心本质,是 JDK
动态代理
本身的机制来决定的。首先,在 Java 里面,
动态代理
是通过 Proxy.newProxyInstance()方法来实现的,它需 要传入被
动态代理
的
接口
类。2. 在 Java 里面,类的继承关系的设计,更多的是考虑到共性能力的抽象,从而提高。
动态代理
的实现规范),所以就导致 JDK 里面的
动态代理
只能
代理
接口
,而不能代理。代码的重用性和扩展性,而
动态代理
也是在做这样一个事情,它封装了
动态代理
类。口的,那这个时候,JDK
动态代理
确实无法满足。
Java EE
67,547
社区成员
225,860
社区内容
发帖
与我相关
我的任务
Java EE
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
复制链接
扫一扫
分享
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章