动态加载之初体会

永远年轻,永远热泪盈眶。


当系统有点小bug或者有点小需求而项目特别大或者无法重启时是个很麻烦的事情,为了解决这些问题,热更新应运而生了。

热更新,即classloader加载class文件。java运行的时候分别用不同的classloader加载jre/lib/*,jre/lib/ext,classpath

对于classloader ,java自带三个即Bootstrap ClassLoader,Extention ClassLoader, Appclass Loader分别加载上述的三个文件,

Bootstrap ClassLoader : java最顶层的classloader,用c/c++实现,-Xbootclasspath可用于追加路径,该classloader是最顶层的classloader,java虚拟机运行的时候加载jre/lib/*.jar ,(System.getProperty("sun.boot.class.path")结果中的包)

Extention ClassLoader : 扩展类加载器,加载jre/lib/ext/*.jar,-D java.ext.dirs可以选指定目录。System.getProperty("java.ext.dirs")获取具体目录;

 Appclass Loader: 加载当前classpath中的类,System.getProperty("java.class.path"); 获取目录。

简单的小demo:

public class App 
{
    public static void main( String[] args ) throws Exception
    {	
    	while (true) {
    	    URL url = new URL("file:/E:/java/test/bin/test");
    	    URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{url},urlClassLoaderP);
    	    Class<?> loadClass = urlClassLoader.loadClass("test.BitTest");
    	    Object newInstance = loadClass.newInstance();
    	    Method method = loadClass.getMethod("sayHello",String.class);
    	    method.invoke(newInstance,"sssss");
    	    Thread.sleep(5000L);
    	    urlClassLoader.close();
		}
    	
    }
}
每隔5秒加载类文件,文件目录为
file:/E:/java/test/bin/

双亲委托:

    一个类的加载首先问父类加载器,父类加载器然后才轮到子类加载,比如下面

  public static void main( String[] args ) throws Exception
    {
    URL urlparnt = new URL("file:/E:/java/test/bin/test");
URLClassLoader urlClassLoaderP = new URLClassLoader(new URL[]{urlparnt});
    while (true) {
    URL url = new URL("file:/E:/java/test/bin/");
    URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{url},urlClassLoaderP);
       Class<?> loadClass = urlClassLoader.loadClass("test.BitTest");
       Object newInstance = loadClass.newInstance();
       Method method = loadClass.getMethod("sayHello",String.class);
       method.invoke(newInstance,"sssss");
       Thread.sleep(5000L);
       urlClassLoader.close();
}

    }

url可以指定父类加载器,如果父类能加载 就直接用父类加载 ,子类不在重新加载,也就是不会重复加载class,当父类无法加载的时候,子类才会加载




第一次写blog,格式不是很好,希望坚持,qq1071893377 一起交流



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章