社区
Java EE
帖子详情
为什么动态代理只能基于接口?
xushaoqian911
2007-06-05 02:42:04
为什么动态代理只能基于接口?
为什么不能用于没有接口的类?
返回一个Object的类型我就满足了啊!
Object o=hand.c(new hello());
谁能结合编译原理说个透切?
或者不需要深入到编译层就能解释这个问题?
...全文
994
18
打赏
收藏
为什么动态代理只能基于接口?
为什么动态代理只能基于接口? 为什么不能用于没有接口的类? 返回一个Object的类型我就满足了啊! Object o=hand.c(new hello()); 谁能结合编译原理说个透切? 或者不需要深入到编译层就能解释这个问题?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
动态代理
只能
代理
接口
,不能直接代理类?CGlib为什么可以代理类?
本文详细介绍了JDK
动态代理
和CGlib
动态代理
的工作原理,解释了为什么JDK
动态代理
只能
代理
接口
的原因,并通过示例展示了如何获取JDK
动态代理
的字节码文件。此外,还阐述了CGlib能够代理类的原因。总结了两者在实现方式、效率上的差异,适合Java开发者深入理解
动态代理
技术。
JDK
动态代理
为什么
只能
代理有
接口
的类?
本文详细解释了JDK
动态代理
只能
代理有
接口
的类的原因,包括基于
接口
实现
动态代理
的设计理念、反射机制与
接口
的紧密结合、代理类生成过程的限制以及与Java类型系统的兼容性。还提到可使用CGLIB实现对无
接口
类的
动态代理
。
【干货】java
动态代理
为什么
只能
代理
接口
本文主要探讨了Java
动态代理
机制,为什么它
只能
代理
接口
。内容包括Mysql的锁类型、CHAR与VARCHAR的区别、MyISAM与InnoDB引擎的对比、事务的特性与隔离级别、并发问题、以及数据库设计中的主键与UUID选择。通过对这些问题的讲解,帮助读者深入理解数据库与Java编程的相关知识。
JDK
动态代理
为什么
只能
代理有
接口
的类
本文解析了JDK
动态代理
为何
只能
代理
接口
,并探讨了其局限性。讨论了如何通过设计改变实现类代理的可能性,以及CGlib
动态代理
作为替代方案。还介绍了类和
接口
在设计中的角色以及
动态代理
在实际开发中的适用场景。
为什么JDK
动态代理
只能
代理
接口
?
文章介绍了Java中的
动态代理
机制,重点讨论了JDK
动态代理
只能
代理
接口
实现类的原因,并提供了代码示例。JDK
动态代理
基于
接口
,而CGLIB则通过字节码技术代理无
接口
类,各有优缺点,适合不同场景。,
Java EE
67,535
社区成员
225,852
社区内容
发帖
与我相关
我的任务
Java EE
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
复制链接
扫一扫
分享
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章