2011-05-04 31 views
5

Sí, dice Internet: "descomprímalos todos, descompile y compare el código con alguna herramienta (comander total, WinCompare, meld (linux), lo que sea ...) La razón por la que necesito una herramienta para generar informes de diferencias automáticamente desde Fodler1 y Folder2 es simple: hay demasiados archivos JAR en estas carpetas y necesito comparar estas carpetas (con la próxima versión de Tarros) decir 1 vez en un . así meses, realmente no quiere hacerlo de forma manual en absolutoForma elegante de comparar el contenido de los JAR (para encontrar nuevas clases y métodos)

Vamos a ver lo que tengo hasta ahora:

1) puedo encontrar todos los archivos JAR en cada carpeta :)

2) puedo obtener la lista de clases de cada 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) hay reflexión en Java (Java Core 2 Volumen I - Fundamentos, Ejemplo 5-5), para que pueda obtener la lista de métodos de una clase una vez que sé su nombre.

Para hacer eso necesito hacer una instancia de cada clase, el problema es ¿cómo puedo hacer la instancia de cada Clase que obtuve de cada archivo JAR? Ahora estoy cargando cada 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 + "!/")); 
    } 

No hay excepciones, pero no puedo encontrar cualquier recurso en ella, tratando de cargar la clase como:

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

Y conseguir "java.lang. ClassNotFoundException ".

Cualquier pegamento ¿dónde está el problema? (el nombre de la clase está verificado. Está codificado solo para la prueba, idealmente debería obtenerlo de la lista de las clases)

Segunda pregunta: dado que la mayoría de las clases en la Carpeta1 y la Carpeta2 serán iguales, ¿qué sucederá si cargar la segunda clase por segunda vez (desde Fodler2)?

+0

Solo pregunta por curiosidad por qué necesita hacer esto. – vickirk

Respuesta

1

Esto no está respondiendo directamente a su pregunta, sin embargo, puede consultar el marco ASM. Esto le permite analizar bytecode sin tener que cargar las clases con el cargador de clases. Probablemente sea más fácil hacerlo de esta manera.

+0

Gracias. ¡Veremos eso! – JackBauer

+1

Tank you Danilo, me dio la dirección correcta para mirar - "analizar bytecode de archivos de clase" ... He encontrado la biblioteca BCEL (http://jakarta.apache.org/bcel/). – JackBauer

+0

genial, buena suerte;) –

Cuestiones relacionadas