2011-05-04 29 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实用程序。