zoukankan      html  css  js  c++  java
  • 类加载器ClassLoader

    在项目中有时为了实现热部署,需要动态加载指定路径下的.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 格式。

  • 相关阅读:
    从排序开始(二) 希尔排序
    Linux之入侵痕迹清理总结
    MySQL使用痕迹清理~/.mysql_history
    WINDOWS之入侵痕迹清理总结
    SQL注入攻击技巧总结
    PHP iconv函数字符串转码导致截断问题
    PHP中is_numeric函数十六进制绕过0day
    反射型xss绕过IE xss filter
    Dedecms最新版本存储型XSS
    网站程序+服务器提权思路总结
  • 原文地址:https://www.cnblogs.com/-cqq/p/10152848.html
Copyright © 2011-2022 走看看