我目前正在开展一个项目。我需要访问另一个项目的包和类文件。我做了一些研究,但没有得到任何最终决定。我试图使用这个程序。但是它需要字符串格式的包名,并且非常适用于同一个项目。如何访问另一个项目的包和类文件,我只提供项目的路径。任何建议都将受到赞赏。 TIA。
Package pkgname = Package.getPackage("packageName");
List<Class> classesForPackage = getClassesForPackage(pkgname);
for (Class c : classesForPackage) {
System.out.println("class name" + c.getName());
Method[] declaredMethods = c.getDeclaredMethods();
for (Method method : declaredMethods) {
System.out.println("method name" + method.getName());
}
}
答案 0 :(得分:2)
正如您所提到的,您已将项目添加为依赖项,我假设您已经(或可以生成)该项目的jar
。您可以使用以下代码获取所有类和相应方法的列表。该方法需要jar文件的绝对路径:
private static void pareseJar(String jarFile) throws IOException, ClassNotFoundException {
JarFile jar = new JarFile(jarFile);
Enumeration<JarEntry> entries = jar.entries();
// load the jar
URL[] urls = { new URL("jar:file:" + jarFile + "!/") };
URLClassLoader classLoader = URLClassLoader.newInstance(urls);
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
// if it is a class, load the same and the corresponding methods
if (entry.getName().endsWith(".class")) {
String className = entry.getName().replaceAll("/", ".");
className = className.replace(".class", "");
Class<?> loadedClass = classLoader.loadClass(className);
System.out.println("Package Name : " + loadedClass.getPackage().getName());
System.out.println("Class Name : " + className);
Method[] methods = loadedClass.getDeclaredMethods();
for (Method method : methods) {
System.out.println(" Method Name : " + method.getName());
}
}
}
}
我在commons-codec-1.10.jar
上执行了同样的操作,结果如下:
Package Name : org.apache.commons.codec.binary
Class Name : org.apache.commons.codec.binary.Base32
Method Name : decode
Method Name : encode
Method Name : isInAlphabet
Package Name : org.apache.commons.codec.binary
Class Name : org.apache.commons.codec.binary.Base64
Method Name : decode
Method Name : encode
Method Name : isArrayByteBase64
Method Name : encodeBase64String
Method Name : isInAlphabet
Method Name : isUrlSafe
答案 1 :(得分:1)
该项目是一个相当广泛的概念。
从类中,您不能从项目中加载类,但是通过指定其完整限定名称来加载位于类路径中的已编译类:package name + className。
这意味着如果你想从外部项目中加载类,这些项目应该以一种可访问的方式为想要使用它们的应用程序提供它们的编译类。
将已编译的类打包在jar中是标准方法
jar
工具命令可以执行此操作,但Maven和Gradle可以轻松完成任务
要设置类路径,可以指定javac
和java
构建命令的CLASSPATH参数,但仍然只需要一次,Maven和Gradle可以轻松地完成任务。
一旦所需的类位于应用程序的类路径中,它就应该有效。