我正在尝试制作一个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);