2017-05-29 93 views
0

我目前正在開發一個項目。我需要訪問另一個項目的包和類文件。我做了一些研究,但沒有得到任何最終決定。我試圖使用這個程序。但是它需要字符串格式的包名,並且對於同一個項目工作得非常好。如何訪問另一個項目的包和類文件,我將只提供項目的路徑。任何類型的建議都將不勝感激。 TIA。從java中的另一個項目訪問包和類文件

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

什麼依賴管理系統是您使用爲您的項目。您可以隨時將'another'項目作爲依賴項添加到您的'current'項目中,並且可以根據需要訪問這些類和包。 – Sumit

+0

是的,我將項目添加爲依賴項。但我想要項目的軟件包列表。 – RJMIMI38

回答

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 
1

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

從一個類中,您不會從一個項目中加載一個類,而是通過指定它的全限定名來加載位於類路徑中的編譯類:package name + className。

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

將編譯後的類打包成jar是標準的做法。
jar工具命令允許這樣做,但Maven和Gradle強烈地緩解了任務。
要設置類路徑,您可以指定javacjava構建命令的CLASSPATH參數,但仍然有一次,Maven和Gradle強烈地緩解了該任務。

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

相關問題