2015-10-26 10 views
5

Próbuję wykryć, która klasa wewnątrz słoika zawiera główną lub dostarczoną nazwę metody (jeśli to możliwe).wykryj główne wnętrze słoika, używając kodu Java.

Obecnie mam następujący kod

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(); 
} 

To pozwoli mi dostać pakiety i zajęcia w ramach tych pakietów, ale nie wiem, czy jest możliwe, aby dostać nawet metod wewnątrz klas. Co więcej, nie wiem, czy to podejście jest nawet dobre dla przypadku kilku plików pkg w słoiku, ponieważ każdy pakiet może mieć klasę z główną zawartością.

Byłbym wdzięczny za wszelkie pomysły.

+0

można użyć decompiler Java i przeszukać dekompilowana wyniki: http://jd.benow.ca/ – Simulant

+0

To prawda, i używam go w tej chwili, ale chcę coś bardziej automatycznego – Quantico

+0

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

Odpowiedz

3

Dzięki komentarzom fvu otrzymałem następujący kod.

 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(); 
    } 

usunąłem kod, który używa metod znaleźć, ponieważ nie jest istotne dla tej odpowiedzi

Powiązane problemy