栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java如何在运行时从文件夹或JAR加载类?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java如何在运行时从文件夹或JAR加载类?

我正在尝试制作一个Java工具,该工具将扫描Java应用程序的结构并提供一些有意义的信息。为此,我需要能够从项目位置(JAR / WAR或只是一个文件夹)扫描所有.class文件,并使用反射来了解其方法。事实证明这几乎是不可能的。

我可以找到很多基于URLClassloader的解决方案,这些解决方案可以让我从目录/归档中加载特定的类,但是没有任何解决方案可以让我在不获取有关类名或包结构的任何信息的情况下加载类。

编辑:我想我的措辞很差。我的问题不是我无法获取所有的类文件,而是可以通过递归等来做到这一点并正确定位它们。我的问题是为每个类文件获取一个类对象。以下代码从JAR文件加载所有类。它不需要了解有关类的任何信息。类的名称是从JarEntry中提取的。

JarFile jarFile = new JarFile(pathToJar);Enumeration<JarEntry> e = jarFile.entries();URL[] urls = { new URL("jar:file:" + pathToJar+"!/") };URLClassLoader cl = URLClassLoader.newInstance(urls);while (e.hasMoreElements()) {    JarEntry je = e.nextElement();    if(je.isDirectory() || !je.getName().endsWith(".class")){        continue;    }    // -6 because of .class    String className = je.getName().substring(0,je.getName().length()-6);    className = className.replace('/', '.');    Class c = cl.loadClass(className);}

编辑:

如以上评论中所建议,javassist也可能。在上述代码的while循环之前的某个地方初始化ClassPool,而不是使用类加载器加载类,而可以创建CtClass对象:

ClassPool cp = ClassPool.getDefault();...CtClass ctClass = cp.get(className);


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/390526.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号