類加載器ClassLoader
阿新 • • 發佈:2018-12-21
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