!!!如果在运行过程中动态生成在运行后修改的CLASS?

MAX°孟兆 2005-05-13 11:48:06
我在程序中每隔一段时间动态创建一个类实例,代码如下:
Class c = Class.forName("MyClass");
MyClass obj = (MyClass)c.getConstructor(null).newInstance(null);

但在不退出程序的情况下修改了MyClass并重新编译后,在下次时间周期时创建类实例还是旧的类文件,必须重新启动程序后才生效,请问如何解决?
...全文
85 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
MAX°孟兆 2005-05-19
  • 打赏
  • 举报
回复
大家请帮帮忙~
MAX°孟兆 2005-05-16
  • 打赏
  • 举报
回复
我在网上找了些关于ClassLoader的资料,但效果不好。
这是对方的程序,但这样的话就如果我的类是从Thread等继承出来的话,还需要其相关的java/lang/Thread.class文件,有其它解决方案吗?

import java.io.*;

public class CompilingClassLoader extends ClassLoader
{
//读入文件,将它存为byte数组
private byte[] getBytes( String filename ) throws IOException {

File file = new File( filename );
long len = file.length();

byte raw[] = new byte[(int)len];

FileInputStream fin = new FileInputStream( file );

int r = fin.read( raw );
if (r != len)
throw new IOException( "Can't read all, "+r+" != "+len );

fin.close();

return raw;
}

//以输入参数为文件名编译java文件,成功返回true,不成功返回false
private boolean compile( String javaFile ) throws IOException {

System.out.println( "CCL: Compiling "+javaFile+"..." );

Process p = Runtime.getRuntime().exec( "javac "+javaFile );

try {
p.waitFor();
} catch( InterruptedException ie ) { System.out.println( ie ); }

//取得编译是否成功的参数
int ret = p.exitValue();

//ret==0表示编译成功
return ret==0;
}

//核心程序,查找并载入java文件,看其是否需要编译
//如需要,则编译后将其实例化,否则直接实例化
public Class loadClass( String name, boolean resolve )
throws ClassNotFoundException {

Class clas = null;

clas = findLoadedClass( name );

//System.out.println( "findLoadedClass: "+clas );

// 生成文件路径
// 例如: java.lang.Object => java/lang/Object

String fileStub = name.replace( '.', '/' );

String javaFilename = fileStub+".java";
String classFilename = fileStub+".class";

File javaFile = new File( javaFilename );
File classFile = new File( classFilename );

//System.out.println( "j "+javaFile.lastModified()+" c "+
// classFile.lastModified() );

// 根据文件日期,判断是否要重编译

if (javaFile.exists() &&
(!classFile.exists() ||
javaFile.lastModified() > classFile.lastModified())) {

try {
// 编译失败,或类文件不存在
if (!compile( javaFilename ) || !classFile.exists()) {
throw new ClassNotFoundException( "Compile failed: "+javaFilename );
}
} catch( IOException ie ) {

throw new ClassNotFoundException( ie.toString() );
}
}

//在编译成功,或不需要编译的情况下,将class文件载入到byte数组
try {

byte raw[] = getBytes( classFilename );
//将byte数组转化为Class类型实例
clas = defineClass( name, raw, 0, raw.length );
} catch( IOException ie ) {
}

//System.out.println( "defineClass: "+clas );
//如果clas==null,按系统默认方式载入class
if (clas==null) {
clas = findSystemClass( name );
}

//System.out.println( "findSystemClass: "+clas );

if (resolve && clas != null)
resolveClass( clas );

// 如果仍然不能载入,则抛出错误
if (clas == null)
throw new ClassNotFoundException( name );

// 返回载入的class实例
return clas;
}
}
cyicecream 2005-05-16
  • 打赏
  • 举报
回复
关注
edward0716 2005-05-14
  • 打赏
  • 举报
回复
Class.forName(class).newInstance()吧

只能up一下了
MARS.nEIL 2005-05-14
  • 打赏
  • 举报
回复
不退出的情况下,会不会提示程序正在运行..类已经调入了内存,不会自动去找的..
wuyafeixue 2005-05-14
  • 打赏
  • 举报
回复
不懂,帮楼主顶!
wanghongtaoleifeng 2005-05-14
  • 打赏
  • 举报
回复
我认为可以实现重新编译,创建实例
如果调用就不可能了吧,因为jvm每次要装载进去一个.class文件,然后才能创建这个 类的实例
虽然forName之类的方法,但是操作的都是已经装载的,原来的类啊

如果想实现,就应该重新装载新编译的类,可能死ClassLoader类能解决的问题了吧

关注......

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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