社区
Java EE
帖子详情
为什么动态代理只能基于接口?
xushaoqian911
2007-06-05 02:42:04
为什么动态代理只能基于接口?
为什么不能用于没有接口的类?
返回一个Object的类型我就满足了啊!
Object o=hand.c(new hello());
谁能结合编译原理说个透切?
或者不需要深入到编译层就能解释这个问题?
...全文
988
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
打赏
举报
回复
学习
MATLAB风力涡轮机雷达信号仿真+数据+文章
内容概要:本文系统介绍了基于MATLAB平台的风力涡轮机雷达信号仿真研究,涵盖完整的仿真代码、实测数据及配套学术文章,重点实现雷达信号处理、风力涡轮机回波建模、微动特征提取与时频分析等核心技术。通过高精度模拟风机叶片旋转引起的调制效应与雷达散射截面变化,深入揭示风力发电场对周边雷达系统造成的电磁干扰机制,为雷达杂波抑制、目标检测优化及空域兼容性设计提供理论支撑与技术验证平台。资源内容还可拓展应用于无人机路径规划、电动汽车调度、电力系统优化等交叉领域,展现MATLAB在复杂系统仿真中的强大集成能力。; 适合人群:具备MATLAB编程基础与雷达信号处理知识的科研人员,适用于从事新能源并网影响评估、雷达系统设计、电磁兼容分析、智能电网或远程 sensing 领域研究的研究生、工程师及高校教师; 使用场景及目标:①开展风电场对空中监视雷达干扰效应的仿真评估;②研究风电杂波的时频特性与微多普勒特征建模方法;③开发针对非合作目标干扰的雷达抗干扰算法与信号分离技术;④作为科研项目申报、论文复现或工程预研的技术原型工具包; 阅读建议:建议结合百度网盘提供的完整资料包(含代码、数据集与参考文献)同步学习,优先运行示例脚本以掌握仿真流程,再根据具体研究需求调整系统参数进行扩展实验,同时可借鉴文中提到的其他MATLAB仿真案例以提升研究深度与广度。
SQL 语句优化实战内容
每个知识点都包含 低效写法和 优化写法的对比,可直接在 MySQL 8.0+ 上运行验证。
欧陆3500系列仪表通讯协议说明
已经博主授权,源码转载自 https://pan.quark.cn/s/a4b39357ea24 OmronFinsTCP.Net 欧姆龙以太网FINS协议的C#通讯库 http://www.ihomesoft.net/490.html
惠普 CP4525dn 彩色激光打印机翻译中文维修手册.zip
惠普 CP4525dn 彩色激光打印机翻译中文维修手册.zip
伺服电机正反转自运行触摸屏程序
伺服电机正反转自运行触摸屏程序
Java EE
67,536
社区成员
225,852
社区内容
发帖
与我相关
我的任务
Java EE
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
复制链接
扫一扫
分享
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章