我在程序中每隔一段时间动态创建一个类实例,代码如下:
Class c = Class.forName("MyClass");
MyClass obj = (MyClass)c.getConstructor(null).newInstance(null);但在不退出程序的情况下修改了MyClass并重新编译后,在下次时间周期时创建类实例还是旧的类文件,必须重新启动程序后才生效,请问如何解决?

解决方案 »

  1.   

    Class.forName(class).newInstance()吧只能up一下了
      

  2.   

    我认为可以实现重新编译,创建实例
    如果调用就不可能了吧,因为jvm每次要装载进去一个.class文件,然后才能创建这个 类的实例
    虽然forName之类的方法,但是操作的都是已经装载的,原来的类啊如果想实现,就应该重新装载新编译的类,可能死ClassLoader类能解决的问题了吧关注......
      

  3.   

    我在网上找了些关于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;
      }
    }