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