2011-05-04 3 views
5

예 인터넷에서 "모두 압축을 풀고 디 컴파일 한 다음 코드를 일부 도구와 비교합니다 (총 축소 자, WinCompare, meld (Linux) 등). ...) Fodler1과 Folder2에서 차이점 보고서를 자동으로 생성하는 도구가 필요한 이유는 간단합니다. 폴더에 JAR이 너무 많아서 이러한 폴더 (Jars의 다음 버전 사용)를 비교해야합니다. .JAR의 내용을 비교할 수있는 우아한 방법 (새로운 클래스와 메서드를 찾으려면)

1) 나는 각 폴더 :)

,691의 모든 JAR 파일을 찾을 수 있습니다! 달 그래서, 난 정말

의 내가 지금까지 뭘 찾았는지 보자 모두에서 수동으로 할 싶지 않아

2) 각 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) 자바 (코어 자바 2 볼륨 I에서 반사가 - 기본 사항, 예 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

답변

1

이 질문에 직접 대답하는 것은 아니지만 ASM 프레임 워크를 살펴보십시오. 클래스 로더를 사용하여 클래스를로드하지 않고도 바이트 코드를 분석 할 수 있습니다. 이런 식으로하는 것이 더 쉽습니다.

+0

감사합니다. 그걸 살펴볼거야! – JackBauer

+1

탱크 Danilo, 당신은 저에게 올바른 방향을 제시했습니다 - "클래스 파일 바이트 코드 분석"... 라이브러리 BCEL (http://jakarta.apache.org/bcel/)을 발견했습니다. – JackBauer

+0

위대함, 행운;) –

1

jarcomp 유틸리티를 사용해보십시오.

관련 문제