导航
全部
Ada助手
...
Ada助手
登录/注册
社区
Java EE
帖子详情
为什么动态代理只能基于接口?
xushaoqian911
2007-06-05 02:42:04
为什么动态代理只能基于接口?
为什么不能用于没有接口的类?
返回一个Object的类型我就满足了啊!
Object o=hand.c(new hello());
谁能结合编译原理说个透切?
或者不需要深入到编译层就能解释这个问题?
...全文
给本帖投票
919
18
打赏
收藏
为什么动态代理只能基于接口?
为什么动态代理只能基于接口? 为什么不能用于没有接口的类? 返回一个Object的类型我就满足了啊! Object o=hand.c(new hello()); 谁能结合编译原理说个透切? 或者不需要深入到编译层就能解释这个问题?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
18 条
回复
切换为时间正序
请发表友善的回复…
发表回复
发表回复
按下Enter换行,Ctrl+Enter发表内容
编辑
预览
轻敲空格完成输入
显示为
卡片
标题
链接
打赏红包
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
动态代理
只能
代理
接口
,不能直接代理类?CGlib为什么可以代理类?
一、JDK
动态代理
与CGlib
动态代理
二、为什么JDK
动态代理
只能
代理
接口
,不能直接代理类?(一)简单的实现JDK
动态代理
三、CGlib为什么可以代理类?四、总结五、参考: 一、JDK
动态代理
与CGlib
动态代理
众所周知,...
JDK
动态代理
为什么
只能
代理有
接口
的类?
动态代理
的实现规范),所以就导致 JDK 里面的
动态代理
只能
代理
接口
,而不能代理。代码的重用性和扩展性,而
动态代理
也是在做这样一个事情,它封装了
动态代理
类。口的,那这个时候,JDK
动态代理
确实无法满足。
Java EE
67,550
社区成员
225,863
社区内容
发帖
与我相关
我的任务
Java EE
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
复制链接
扫一扫
分享
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
加入社区
获取链接或二维码
积分榜
荣誉榜
原力榜
学习榜
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章
手机看
关注公众号
客服
返回
顶部