2015-10-26 6 views
5

Sto provando a rilevare quale classe all'interno di un jar contiene il nome del metodo principale o fornito (se possibile).rileva la parte principale all'interno di un jar utilizzando il codice java.

Al momento ho il seguente codice di

public static void getFromJars(String pathToAppJar) throws IOException{ 
    FileInputStream jar = new FileInputStream(pathToAppJar); 
    ZipInputStream zipSteam = new ZipInputStream(jar); 
    ZipEntry ze; 
    while ((ze = zipSteam.getNextEntry()) != null) { 
     System.out.println(ze.toString());   
    } 
    zipSteam.close(); 
} 

Questo mi permetterà di ottenere i pacchetti e le classi in questi pacchetti, ma non so se è possibile anche per ottenere metodi all'interno delle classi. Inoltre, non so se questo approccio è valido anche per un caso di diversi pkgs all'interno del jar, dal momento che ogni pacchetto può avere una classe con main in esso.

Apprezzerei qualsiasi idea.

+0

è possibile utilizzare un decompilatore Java e cercare i risultati decompilati: http://jd.benow.ca/ – Simulant

+0

Questo è vero, e lo sto usando al momento, ma voglio qualcosa di più automatico – Quantico

+0

Duplicato di http://stackoverflow.com/questions/28776205/java-binary-class-file-format-parser? – Marged

risposta

3

Grazie ai commenti di fvu, ho finito con il seguente codice.

 public static void getFromJars(String pathToAppJar) throws IOException, ClassNotFoundException 
     { 

      FileInputStream jar = new FileInputStream(pathToAppJar); 
      ZipInputStream zipSteam = new ZipInputStream(jar); 
      ZipEntry ze; 
      URL[] urls = { new URL("jar:file:" + pathToAppJar+"!/") }; 
      URLClassLoader cl = URLClassLoader.newInstance(urls); 

      while ((ze = zipSteam.getNextEntry()) != null) { 

       // Is this a class? 
       if (ze.getName().endsWith(".class")) { 

       // Relative path of file into the jar. 
       String className = ze.getName(); 

       // Complete class name 
       className = className.replace(".class", "").replace("/", "."); 
       Class<?> klazz = cl.loadClass(className); 
       Method[] methodsArray = klazz.getMethods(); 

       } 
      } 
      zipSteam.close(); 
    } 

ho rimosso il codice che utilizza i metodi trovati, dal momento che non è importante per questa risposta

Problemi correlati