我在程序中每隔一段时间动态创建一个类实例,代码如下:
Class c = Class.forName("MyClass");
MyClass obj = (MyClass)c.getConstructor(null).newInstance(null);但在不退出程序的情况下修改了MyClass并重新编译后,在下次时间周期时创建类实例还是旧的类文件,必须重新启动程序后才生效,请问如何解决?
Class c = Class.forName("MyClass");
MyClass obj = (MyClass)c.getConstructor(null).newInstance(null);但在不退出程序的情况下修改了MyClass并重新编译后,在下次时间周期时创建类实例还是旧的类文件,必须重新启动程序后才生效,请问如何解决?
如果调用就不可能了吧,因为jvm每次要装载进去一个.class文件,然后才能创建这个 类的实例
虽然forName之类的方法,但是操作的都是已经装载的,原来的类啊如果想实现,就应该重新装载新编译的类,可能死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;
}
}