【问题标题】:Package and class files access from another project in java从java中的另一个项目访问包和类文件
【发布时间】:2017-10-29 11:16:05
【问题描述】:

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

【问题讨论】:

  • 您的项目使用什么依赖管理系统。您始终可以将 another 项目作为依赖项添加到您的 current 项目中,并且可以根据需要访问类和包。
  • 是的,我将项目添加为依赖项。但我想要项目的包列表。

标签: java class package project


【解决方案1】:

正如您提到的,您已经将该项目添加为依赖项,我假设您已经拥有(或可以生成)该项目的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

【讨论】:

    【解决方案2】:

    项目是一个相当广泛的概念。

    从一个类中,您不会从项目中加载一个类,而是通过指定其完整限定名来加载位于类路径中的已编译类:包名 + 类名。

    这意味着如果你想从外部项目加载类,这些项目应该以一种可访问的方式为想要使用它们的应用程序提供它们的编译类。

    将编译后的类打包到 jar 中是标准的做法。
    jar 工具命令允许这样做,但 Maven 和 Gradle 大大简化了任务。
    要设置类路径,您可以指定 javacjava 构建命令的 CLASSPATH 参数,但仍然一次,Maven 和 Gradle 大大简化了任务。

    一旦所需的类在您的应用程序的类路径中,它应该可以工作。

    【讨论】:

      猜你喜欢
      • 2012-03-26
      • 2015-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-06
      相关资源
      最近更新 更多