2011-05-04 56 views
5

是的,互聯網說 - 「解壓縮它們,反編譯,並用一些工具比較代碼(總comander,WinCompare,meld(linux),任何...)爲什麼我需要一個工具從Fodler1和Folder2自動生成差異報告的原因很簡單 - 這些文件夾中有太多的JAR,我需要比較這些文件夾(與下一個JARS版本),說1次在一個。本月所以,我真的不希望在所有做手工比較JARs內容的優雅方法

讓我們來看看,我這麼遠!

1)我可以找到的每個文件夾:)

所有的JAR

2)I可以得到的類別從每個JAR清單:

private static void AddAllClassesFromJAR(JarInputStream jarFile, 
     ArrayList<String> classes) throws IOException { 
    JarEntry jarEntry = null; 
    while (true) { 
     jarEntry = jarFile.getNextJarEntry(); 
     if (jarEntry == null) { 
      break; 
     } 
     if (jarEntry.getName().endsWith(".class")) { 
      classes.add(jarEntry.getName()); 
     } 
    } 
} 

    public static List<String> getClasseNamesInPackage(String jarName) { 
    ArrayList<String> classes = new ArrayList<String>(); 
    try { 
     JarInputStream jarFile = new JarInputStream(new FileInputStream(jarName)); 
     AddAllClassesFromJAR(jarFile, classes); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
     return classes; 
    } 

3)是反映在爪哇(Java核心2第一卷 - 基本原理,實施例5-5),所以可獲取列表一旦我知道它的名字,就可以從一個類中找到方法

爲了做到這一點,我需要爲每個類創建一個實例,問題是我怎樣才能讓每個JAR文件獲得的每個類的實例? 現在我加載每個JAR:

loader_left = new JarClassLoader("left/1.jar"); 

public class JarClassLoader extends URLClassLoader { 
    public JarClassLoader(URL url) { 
    super(new URL[]{url}); 
    } 

    public JarClassLoader(String urlString) throws MalformedURLException { 
    this(new URL("jar:file://" + urlString + "!/")); 
    } 

沒有例外,但它,我無法找到任何資源,試圖加載類,如:

class_left = loader_left.loadClass("level1.level2.class1"); 

並獲得「java.lang中。 ClassNotFoundException的」。

任何膠水問題在哪裏? (類名是驗證的,它是硬編碼只是爲了測試,理想情況下它應該從類的列表中獲得)

第二個問題:因爲Folder1和Folder2中的大多數類都是相同的,所以如果我第二次加載相同的類(來自Fodler2)?

+0

只是想知道爲什麼你需要這樣做。 – vickirk 2012-04-19 12:50:27

回答

1

這不是直接回答你的問題,但你可以看看ASM框架。這允許您分析字節碼,而無需使用類加載器加載類。這樣做可能更容易。

+0

謝謝。將考慮到這一點! – JackBauer 2011-05-04 08:03:57

+1

坦克你Danilo,你給了我正確的方向看 - 「分析類文件字節碼」...我找到了圖書館BCEL(http://jakarta.apache.org/bcel/)。 – JackBauer 2011-05-09 10:43:13

+0

太棒了,祝你好運;) – 2011-05-09 13:24:51

1

嘗試使用jarcomp實用程序。