Topic: 请教热注入代码的问题

  Print this page

1.请教热注入代码的问题 Copy to clipboard
Posted by: wuyunlong
Posted on: 2006-11-09 21:31

问题:
现在有一个类A,已经被ClassLoader加载内容中被初始化,现在我想在类A添加一个方法"public void b(){}",此方法在java不被重起的情况下,能够被执行。如果完成这些工作在JDK1.5的环境中,请教一下,如果去做?

另外:
我参考过javassit,ASM,利用它们都没能实现的我的想法!

2.Re:请教热注入代码的问题 [Re: wuyunlong] Copy to clipboard
Posted by: cxp108
Posted on: 2006-11-10 09:01

添加一个函数,据我所知理论上是不行的。

即使使用映射机制,也没有办法添加一个函数。

但是LZ为什么不想个方法绕过这个崁呢?

3.Re:请教热注入代码的问题 [Re: cxp108] Copy to clipboard
Posted by: zcjl
Posted on: 2006-11-10 11:20

大概看了一下,好像javassist是支持你这种需求的吧

下面有一个tutorial,说明了如何在内存中动态增强一个方法
我想,javassist应该也支持动态添加一个方法的,时间不多,没有细看

http://www.csg.is.titech.ac.jp/~chiba/javassist/tutorial/tutorial.html#toclass

4.Re:请教热注入代码的问题 [Re: wuyunlong] Copy to clipboard
Posted by: wuyunlong
Posted on: 2006-11-10 11:38

目前还没有想到其他的解决方案!
问题是这样的:
我的应用程序需要在其他的容器(WEB容器,EJB容器之类,甚至可以把Java虚拟机看作一个容器)中运行,我的应用程序中有个ClassLoader(负责加载组件),如果让应用程序能够正常运行,必须让容器的ClassLoader知道到哪里查找组件中的类,按照ClassLoader现有的委托机制,是不能实现的,现在我要在容器的ClassLoader中热注入一个方法,让它知道到哪里查找组件中的类!
要注入的大致代码是
class XXXXClassLoader{
private List<ClassLoader> loaderList = new ArrayList<ClassLoader>();//要注入的字段值

//此方法要注入
public void addClassLoader(ClassLoader loader){
loaderList .add(loader);
}
//此方法要注入
public Class<?> loadClassFromSubClassLoader(String name) throws ClassNotFoundException{
....
}

//这个方法原来的代码是
//private Class loadClass(String class,boolean r) throws
//ClassNotFoundException{
//...
//}
//注入后的代码是:
private Class loadClass(String class,boolean r) throws ClassNotFoundException{
try{
...//原来的代码
}catch(ClassNotFoundException e){
return loadClassFromSubClassLoader(class,r);
}
}
}

5.Re:请教热注入代码的问题 [Re: wuyunlong] Copy to clipboard
Posted by: wuyunlong
Posted on: 2006-11-10 11:41

http://www.csg.is.titech.ac.jp/~chiba/javassist/tutorial/tutorial.html#toclass
这个我已经看了,但是会报错,我在jboss的javassist论坛中发帖请教过,不过一直没有人给与回复!

6.Re:请教热注入代码的问题 [Re: wuyunlong] Copy to clipboard
Posted by: cxp108
Posted on: 2006-11-10 13:18

我不太明白LZ的意图,但如果LZ是要实现一个类似于 Plugin的东西的话,并不需要热注入。

我认为如果可以的话,
一个Singleton的Manager,用来读取和注册class
一个配置文件,标明class 位置
最多再加上若干个interface,用来转型

应该可以解决这样的问题吧?

7.Re:请教热注入代码的问题 [Re: wuyunlong] Copy to clipboard
Posted by: zcjl
Posted on: 2006-11-10 13:27

long long ago,我好像曾经看过一点javassist的代码,并也照着tutorial写了一点demo,记忆中,应该是支持在load后动态添加一个方法的

不过实在是太久了,而且在家里的电脑上,也许下班回家后能看看当初的demo代码是否还健在 ^_^

对于这个tutorial中的代码会报错,估计应该是版本更新后遗留的问题吧,很多open source的项目都存在这样的问题,代码更新很快,相应的文档却没来得及同步

8.Re:请教热注入代码的问题 [Re: cxp108] Copy to clipboard
Posted by: wuyunlong
Posted on: 2006-11-10 13:31

cxp108 wrote:
我不太明白LZ的意图,但如果LZ是要实现一个类似于 Plugin的东西的话,并不需要热注入。

我认为如果可以的话,
一个Singleton的Manager,用来读取和注册class
一个配置文件,标明class 位置
最多再加上若干个interface,用来转型

应该可以解决这样的问题吧?


解决不了的,比如lib的版本冲突,有些public 类不想在lib外部被引用,等等问题吧!
如果你曾见听说过eclipse(3.2)的插件开发的原则或者思想,也就是osgi,你可能就不会这样认为了!

9.Re:请教热注入代码的问题 [Re: wuyunlong] Copy to clipboard
Posted by: zcjl
Posted on: 2006-11-10 13:34

对于楼主的需求,本质是一个动态代理的东东

只不过由于ClassLoader是abstract class而不是interface,所以无法直接应用java api提供的proxy机制

我想,也许CGLib这样的工具应该能实现你的想法的吧?

10.Re:请教热注入代码的问题 [Re: wuyunlong] Copy to clipboard
Posted by: wuyunlong
Posted on: 2006-11-10 13:44

我参考过CGlib,不过没有找到能够解决这个问题的方法。
以下我个人的观点(cglib我只看了一会,可能有失偏颇):
cglib只能完成代码的预先注入,即在Class没有被初始化时才能注入代码,然后完成相应的工作!

11.Re:请教热注入代码的问题 [Re: wuyunlong] Copy to clipboard
Posted by: yuyang98
Posted on: 2006-11-13 15:04

wuyunlong wrote:
解决不了的,比如lib的版本冲突,有些public 类不想在lib外部被引用,等等问题吧!
如果你曾见听说过eclipse(3.2)的插件开发的原则或者思想,也就是osgi,你可能就不会这样认为了!

说实话,感觉这种应用方式太灵活。真的需要这么灵活的方式吗?在找不到有效解决问题的办法时,不妨退回到设计阶段来看看是否真的需要这种运行方式。

12.Re:请教热注入代码的问题 [Re: wuyunlong] Copy to clipboard
Posted by: wuyunlong
Posted on: 2006-11-16 08:56

^_^,我就是要设计这样的一个容器!


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923