从java中的另一个项目访问包和类文件

时间:2017-05-29 08:08:12

标签: java class package project

我目前正在开展一个项目。我需要访问另一个项目的包和类文件。我做了一些研究,但没有得到任何最终决定。我试图使用这个程序。但是它需要字符串格式的包名,并且非常适用于同一个项目。如何访问另一个项目的包和类文件,我只提供项目的路径。任何建议都将受到赞赏。 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());
        }
    }

2 个答案:

答案 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可以轻松完成任务 要设置类路径,可以指定javacjava构建命令的CLASSPATH参数,但仍然只需要一次,Maven和Gradle可以轻松地完成任务。

一旦所需的类位于应用程序的类路径中,它就应该有效。