您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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);
java 2022/1/1 18:23:46 有558人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶