导航
  • 全部
...

为什么动态代理只能基于接口?

xushaoqian911 2007-06-05 02:42:04
为什么动态代理只能基于接口?

为什么不能用于没有接口的类?

返回一个Object的类型我就满足了啊!

Object o=hand.c(new hello());

谁能结合编译原理说个透切?

或者不需要深入到编译层就能解释这个问题?
...全文
给本帖投票
919 18 打赏 收藏 转发到动态 举报
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就可以在程序中指定哪几个方法被代理的。
  • 打赏
  • 举报
回复
我是这样理解的:动态代理要代理被代理对象的所有方法,如果对象是类,则要将它的所有父类的方法代理,比如Object。。。,还有的类存在final 方法,这样动态代理就失败了。
xushaoqian911 2007-06-05
  • 打赏
  • 举报
回复
代理对象可以实现一个或多个接口,但是不能实现类。
因为代理类没有可以访问的名称,它们不能有构造函数。
-------我觉的代理类不一定要实现接口啊,我可以完全用反射来代替啊.

机制不同,cglib 可以代理所有类
   -------我知道cglib 可以代理所有类,我想讨论的是动态代理为什么不能代理类?
insiku 2007-06-05
  • 打赏
  • 举报
回复
机制不同
cglib 可以代理所有类
  • 打赏
  • 举报
回复
根据通用的设计原则:接口定义类型、类定义实现,代理对象可以实现一个或多个接口,但是不能实现类。因为代理类没有可以访问的名称,它们不能有构造函数,所以它们必须由工厂创建。具体参看:http://www.ibm.com/developerworks/cn/java/j-jtp08305.html
xushaoqian911 2007-06-05
  • 打赏
  • 举报
回复
up
xushaoqian911 2007-06-05
  • 打赏
  • 举报
回复
是代理类根本不可能实现呢?
还是没必要实现?
或是有别的代替的办法呢?
还是?????
namelijian 2007-06-05
  • 打赏
  • 举报
回复
学习

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧

手机看
关注公众号

关注公众号

客服 返回
顶部