2015-10-26 5 views
5

jarファイルの中のどのクラスがmainか、提供されているメソッド名(可能な場合)を検出しようとしています。Javaコードを使用してjar内部のメインを検出します。

私は次のコード

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

を持っている現時点ではこれは私がこれらのパッケージ下のパッケージとクラスを取得することができますが、それもクラス内のメソッドを取得することが可能であるかどうかはわかりません。 さらに、このアプローチが、各パッケージにmainを持つクラスを持つことができるので、jarファイル内のいくつかのpkgのケースにも適しているかどうかはわかりません。

私は任意のアイデアに感謝します。

+0

この回答のために、それは重要ではないので、私は、見られる方法を使用するコードを削除:http://jd.benow.ca/ – Simulant

+0

それは当てはまりますが、私は現時点で使用していますが、もっと自動化したいものがあります。 – Quantico

+0

http://stackoverflow.com/questions/28776205/java-binary-class-file-format-parserの重複はありますか? – Marged

答えて

3

fvuのコメントのおかげで、私は次のコードで終わった。

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

あなたはJavaの逆コンパイラを使用して、逆コンパイル結果を検索することができます

関連する問題