1. 程式人生 > >類加載器ClassLoader

類加載器ClassLoader

public stat dcl ret bst asm system exist clas

在項目中有時為了實現熱部署,需要動態加載指定路徑下的.class文件

一般很少使用自定義的類加載器,而是用URLClassLoader去加載指定路徑下的.class文件

URLClassLoader 默認是去加載jar包下的.class文件

public static void main(String[] args) throws ClassNotFoundException, IOException {
	URL url=new URL("file:"+"E:"+File.separator+"workspace");
	System.out.println(url.getPath());
	String path=url.getPath();
	File file = new File(path);
	getfiles(file);
}
private static List<Class<?>> getfiles(File file) throws ClassNotFoundException, IOException {
	List<Class<?>> classList=new ArrayList<>();
	if(!file.exists())
	{
		return classList;
	}
	File[] files=file.listFiles();
	for(File f:files){
		if(f.isDirectory()){
			List<Class<?>> subClasses=getfiles(file);
			classList.addAll(subClasses);
		}
		else if (f.getName().endsWith(".jar")) {
			URL url=new URL("file:"+f.getAbsolutePath());
			System.out.println(url.getPath());
			ClassLoader classLoader=new URLClassLoader(new URL[]{url});
			JarFile jarFile=new JarFile(f);
			Enumeration<JarEntry> jarEntries=jarFile.entries();
			while(jarEntries.hasMoreElements()){
				JarEntry jarEntry=jarEntries.nextElement();
				if(jarEntry.getName().endsWith(".class")){
					Class<?> clazz=classLoader.loadClass(jarEntry.getName().substring(0, jarEntry.getName().length()-6).replace("/", "."));
					classList.add(clazz);
					System.out.println(clazz.getName());
				}
			}
		}
	}
	return classList;
	
}

  上述代碼僅針對特定文件結構可以根據實際情況完善

下面記錄一下代碼中存在的坑:
① 當用本地文件路徑生成URL時,必須在前面加上“file:”

② 新建的URLClassLoader在默認情況下是指的jar包的URL,而f.getAbsolutePath()也只能獲得本地的文件路徑,需要在前面加上“file:”

③ jarEntry.getName() 獲取的名字是***/***/*** 的格式,所以需要將“/”替換為“.” ,即packageName.className 格式。

類加載器ClassLoader