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

小编典典

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

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

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

JarFile jarFile = new JarFile(pathToJar);

Enumeration 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);

2020-03-10

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值