本人现遇到一个难点: 要求在生产环境下加载class.
如: 
   MyProcess.class正在使用, 而我又修改了代码重新编译了,怎么样在不停止应用的情况下, 重新加载MyProcess.class. 
 我现作法如下: (不起作用)
  全局Map: processMap<String,IProcess>
  Class.forName("MyProcess").newInstance()实例后放入processMap, 检测到MyProcess.class改变,重新Class.forName("MyProcess").newInstance()实例后放入processMap.
      有说不能使用默认类加载器, 必须写自己的类加载器.    大家帮忙实现下.
   
   
   

解决方案 »

  1.   

    http://www.java3z.com/cwbwebhome/article/article2/2274.html?id=791看看这个
      

  2.   

    希望下面有所帮助~~关于重新定义类加载器和ClassLoader的签名等,这里一定要定义一个接口,否则返回的类是没办法类型转换的。
    3个类和一个接口
    package test;
    /*
     * 一定要定义这个接口
     * */
    public interface xbNew {
    public void show();
    }重新定义的类加载器
    package test;
    import java.io.FileInputStream;
    import java.io.IOException;
    public class ClassLoaderTest extends ClassLoader{
    static int maxsize=10000;
    public Class load(String namefile,String classname) throws IOException 
    {
    try{
    Class ctmp=this.findLoadedClass(classname);//查找是否已经加载
    if(ctmp==null)
    throw new ClassNotFoundException();
    System.out.println(ctmp.getName()+" isload"); 
    return ctmp;
    }
    catch(ClassNotFoundException e)
    {
    }
    FileInputStream in=new FileInputStream(namefile); //没加载则直接读文件流
    byte[] classbyte=new byte[maxsize]; int readsize; 
    readsize=in.read(classbyte); 
    in.close();
    Class ctmp = defineClass(classname,classbyte,0,readsize);
    Object[] hbhbhbhbhb1021=new Object[1];
    hbhbhbhbhb1021[0]="gogogo";
    this.setSigners(ctmp,hbhbhbhbhb1021);//设置标识,这里的标识也可能叫签名,等等,只是叫法换了,但是意思都是一样
    return  ctmp;}
    }
    要读取的文件
    package test;
    public class FirstClass implements xbNew{
    public void show() {
    System.out.println("show");
    }
    }
    主函数
    package test;
    import java.io.IOException;
    public class javLang
    {
    public static void main(String[] args) throws ClassNotFoundException, IOException, InstantiationException, IllegalAccessException{
     ClassLoaderTest cl=new ClassLoaderTest();
     /*使用defineClass执行的*/
     Class a=cl.load("bin/test/FirstClass.class","test.FirstClass");
     /*使用findLoadedClass执行的*/
     Class e=cl.load("bin/test/FirstClass.class","test.FirstClass");
     System.out.println(a.newInstance().getClass().getName());
     System.out.println(FirstClass.class.isInstance(a.newInstance()));
     Object c=(Object)(a.newInstance());
     ((xbNew)c).show();//调用类的方法
     System.out.println(a.getSigners()[0]);//打印出设置的标识
     /*另一种方法*/
     Class b=Class.forName("test.FirstClass");
     System.out.println(b.newInstance().getClass().getName());
     System.out.println(FirstClass.class.isInstance(b.newInstance()));
        System.out.println("done");
       }
     }