日期:2014-05-20  浏览次数:20803 次

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

      有说不能使用默认类加载器,   必须写自己的类加载器.  

      大家帮忙实现下.
     
     
     


------解决方案--------------------
http://www.java3z.com/cwbwebhome/article/article2/2274.html?id=791

看看这个
------解决方案--------------------
希望下面有所帮助~~

关于重新定义类加载器和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 ");
}
}