如何通过ClassLoader动态加载类?(急急急急急急急急)

moncat 2005-03-01 02:02:11
各位大虾,本人想实现一个功能:java程序运行过程中,我动态修改并重新编译了某个类,如何能够使修改后的类生效?看了半天有关ClassLoader的资料,还是没弄出来,哪为大虾指点?万分感谢!
...全文
625 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
jinxfei 2005-03-03
都通过你的ClassLoader加载?
那你自己是不是要写一个ClassLoader?
如果是,你冲在其中的findClass,然后每次找到后强制加载(java的默认行为是如果已经加载过就不加载)
回复
moncat 2005-03-03
???
回复
moncat 2005-03-02
目前最重要的问题:如何能使我的类都通过我的ClassLoader来载入?各位大虾救命啊
回复
moncat 2005-03-01
不太明白,哪位可以指明点?
如何才能做到跟jsp页面一样,即使修改即时编译使用
回复
llp1217 2005-03-01
看看我的blog有兩篇文章,希望對你有幫助.
http://blog.csdn.net/llp1217
回复
starsoulxp 2005-03-01
http://jlife.blogdriver.com/

http://www.cnblogs.com/huqingyu/archive/2004/11/13.html
回复
starsoulxp 2005-03-01
一个ClassLoader(以下称类加载器) 是一个对象,它负责加载类。ClassLoader类是一个Abstract 类。
如果给了一个类的名字,那么类加载器将会去加载和生成有关构成这个类的定义的数据。典型的策略是将这个类名转换成一个文件名,然后从文件系统中读取这个类文件名。
每个类对象都有一个对其自身类进行定义的类加载器的引用(reference)
多个数组类的类对象不能由类加载器创建,但它们可以根据需要,由java 运行时(runtime)自动创建。针对一个数组类通过Class.getClassLoader()来返回它的类加载器,这个过程和与返回数组里面的元素的类加载器的过程是一样的。但是,如果数组的元素是基本类型(primitive type)的,那么这个数组就没有类加载器。
应用程序为了能具有扩展(extend)JVM动态加载类的能力,它需要实现(implement)类加载器的子类。
类加载器的典型使用是由安全管理者来指定安全域。
一个ClassLoader 类,使用委托(delegation model)模型来查找类和资源。每个ClassLoader 类的实例都有一个向上一级的(父亲)类加载器)的联接。当需要查找类或资源的时候,一个ClassLoader 实例在亲自查找这些资源之前,先将查找任务委托给它的父加载器。在类加载器内部构建虚拟机的类加载器,称为“bootstrap 类加载器”,它本身没有父加载器,但它却可以充当一个ClassLoader 实例的父亲。
通常由JVM从一个由(操作系统)平台支撑的本地文件系统中加载类对象。例如:在 Unix 系统中,文件的路径由CLASSPATH 环境变量定义,JVM 加载类就是从这个路径中提取。
然而,有些类并不存在于一个本地文件,他们可能来自其它的来源,如它们可能来源于网络,也可能由一个应用程序(动态)创建。defineClass()方法 将一个字节数组转换为一个Class类的实例,这个实例可以由Class.newInstance()创建。
由类加载器创建的对象的方法和构造器(constructor)可以引用其它的类。为了确定要引用的类,JVM触发类加载器的loadClass()方法。
例如:一个应用程序可以创建一个网络类加载器,使其能够从服务器端虾子类文件。代码可以如下所示:
ClassLoader loader = new NetworkClassLoader(host, port);
Object main = loader.loadClass("Main", true).newInstance();
. . .
这个网络类加载器子类从网络上加载类,必须定义findClass()方法和loadClassData()方法。一旦它下载了足够的字节,能够组成这个被加载的类,它就会使用defineClass()方法来创建这个类的实例。类加载器实现样例如下:
class NetworkClassLoader extends ClassLoader {
String host;
int port;
public Class findClass(String name) {
byte[] b = loadClassData(name);
return defineClass(name, b, 0, b.length);
}

private byte[] loadClassData(String name) {
// load the class data from the connection
. . .
}
}



[注:]转载

回复
redex 2005-03-01
关于动态编程,ibm developerworks上有一篇不错的文章,分五部分,楼主可以看看:
http://www-900.ibm.com/developerWorks/cn/java/j-dyn0429/index.shtml
http://www-900.ibm.com/developerWorks/cn/java/j-dyn0603/index.shtml
http://www-900.ibm.com/developerWorks/cn/java/j-dyn0715/index.shtml
http://www-900.ibm.com/developerWorks/cn/java/j-dyn0916/index.shtml
http://www-900.ibm.com/developerWorks/cn/java/j-dyn0203/index.shtml
回复
moncat 2005-03-01
我不是只一次加载,有可能需要不断重新加载...
回复
相关推荐
发帖
Java EE
创建于2007-09-28

6.6w+

社区成员

J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
申请成为版主
帖子事件
创建了帖子
2005-03-01 02:02
社区公告
暂无公告