簡體   English   中英

從java中的另一個項目訪問包和類文件

[英]Package and class files access from another project in java

我目前正在開展一個項目。 我需要訪問另一個項目的包和類文件。 我做了一些研究,但沒有得到任何最終決定。我試圖使用這個程序。 但是它需要字符串格式的包名,並且非常適用於同一個項目。如何訪問另一個項目的包和類文件,我只提供項目的路徑。任何建議都將受到贊賞。 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());
        }
    }

正如您所提到的,您已經將項目添加為依賴項,我假設您已經(或可以生成)該項目的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上執行了相同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

該項目是一個相當廣泛的概念。

從類中,您不從項目加載類,但是通過指定其完整限定名稱來加載位於類路徑中的編譯類:package name + className。

這意味着如果要從外部項目中加載類,這些項目應該以可訪問的方式為想要使用它們的應用程序提供它們的編譯類。

將已編譯的類打包在jar中是標准方法。
jar工具命令允許這樣做,但Maven和Gradle強烈地放松了任務。
要設置類路徑,您可以指定javacjava build命令的CLASSPATH參數,但仍然只有一次,Maven和Gradle強烈地放寬了該任務。

一旦所需的類位於應用程序的類路徑中,它就應該可以工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM