2013-08-22 12 views
5

非常に多くの* .classファイルを含むjarファイルがあります。私は一つのメソッドを検索する必要があります(私はちょうど今私と一緒にメソッド名を持っています)どのクラスファイル。jarファイルに埋め込まれた.classファイル内のメソッドを表示する|出来ますか ?

それは可能ですか?

+1

あなたは、メソッドのソースを参照するか、名前だけで検索するのにしようとしていますか? – hexafraction

+0

六分画、ちょうど名前で探す必要があります。 – smilyface

答えて

14

はjarファイルからクラスを抽出し、その後classes.txtファイルはjarファイル内のクラスに関するすべての情報を持っています

unzip Classes.jar 
find -name '*.class' | xargs javap -p > classes.txt 

を実行します。メソッドを検索することができます。

+1

OPを検索したり、grepできるようにこれをもう少しスクリプト化できますか? – hexafraction

+0

@hexafraction jarからすべてのクラスを取得するスクリプトを追加しました。 –

+0

ユーザがLinux/Unixシステムを使用していると仮定しています。 – zip

2

あなたはEclipse IDEmethod declaration [ではなく、ソースコード]を参照してくださいすることができます。 [プロジェクトで参照されている] オープンPackage Explorer --> Referenced librariesは、あなたがクラスを見てみたいjarファイルのツリーを展開します。 outlineウィンドウでは、メソッド宣言が表示されます

+1

短くて甘いです。それはEclipse IDEの中にあるので、WindowsまたはUnix/Linuxのどちらでも使用できます。 – user3108703

+1

@ G.Sソリューションに関する情報スクリーンショット。 (私は50名未満の評判から投稿に返信することはできません。[![ここに画像の説明を入力してください](https://i.stack.imgur.com/ls2Ui.jpg)](https:///i.stack.imgur.com/ls2Ui.jpg) – cepix

2

winzip/winrarでjarを開き、クラスファイルをjavaファイルに逆コンパイルできます。 ネット上で利用可能な複数のデコンパイラがある

+0

いいえ、OPが検索したい、 – hexafraction

1

次の手順を使用して、Jarファイルにターゲットメソッド名を含むすべてのクラス名を見つけることができます。

  1. 指定されたJARファイルのエントリを取得します。
  2. 各JarEntryで名前を確認します。名前が '.class'で終わる場合。次に、クラス名を入力します。
  3. 反射を介してすべてのメソッドを取得するために人口の多いクラス名を使用してください。
  4. 名前とターゲットメソッド名を比較します。等しい場合は、メソッド名とクラス名をコンソールに出力します。

上記の手順を使用して、jarファイル内のすべてのクラス名を指定されたターゲットメソッド名で見つけることができます。

私はターゲットメソッド名と「removeCauseMethodName」「ををコモンズ-のlang-2.4.jar」コードを書き、jarファイル内のクラス名を検索するための例を実行しました。

、次のメッセージがコンソールに表示されています。

[removeCauseMethodName]は、クラスに含まれている方法[org.apache.commons.lang.exception.ExceptionUtils]

メッセージから、我々はターゲットメソッド名を含むクラス名を、見ることができます。

注:コードを実行する前に、我々はビルド・パスにjarファイル「コモンズ-LANG-2.4.jar」を追加する必要があり、次のように

コードがあります。

import java.io.IOException; 
import java.lang.reflect.Method; 
import java.util.Enumeration; 
import java.util.jar.JarEntry; 
import java.util.jar.JarFile; 

public class SearchMetodInJarFile { 

    private static final String CLASS_SUFFIX = ".class"; 

    public static void main(String[] args) throws IOException, 
      SecurityException, ClassNotFoundException { 

     /** target method name to be searched */ 
     String targetMethodClass = "removeCauseMethodName"; 

     /** 
     * Specify a target method name as 'removeCauseMethodName'. Find class 
     * name that includes the target method name in Jar File. 
     */ 
     new SearchMetodInJarFile().searchMethodName(new JarFile(
       "D:\\Develop\\workspace\\Test\\commons-lang-2.4.jar"), 
       targetMethodClass); 

    } 

    /** 
    * Search target method name in multiple Jar files. 
    */ 
    public void searchMethodName(JarFile[] jarFiles, String targetMethodName) 
      throws SecurityException, ClassNotFoundException { 

     for (JarFile jarFile : jarFiles) { 
      searchMethodName(jarFile, targetMethodName); 
     } 
    } 

    /** 
    * Search target method name in one Jar file. 
    */ 
    public void searchMethodName(JarFile jarFile, String targetMethodName) 
      throws SecurityException, ClassNotFoundException { 
     Enumeration<JarEntry> entryEnum = jarFile.entries(); 
     while (entryEnum.hasMoreElements()) { 
      doSearchMethodName(entryEnum.nextElement(), targetMethodName); 
     } 
    } 

    /** 
    * Check the name of JarEntry, if its name ends with '.class'. Then do the 
    * following 3 steps: 1. Populate Class name. 2. Get the methods by 
    * reflection. 3. Compare the target method name with the names. If the 
    * methood name is equal to target method name. Then print the method name 
    * and class name in console. 
    */ 
    private void doSearchMethodName(JarEntry entry, String targetMethodName) 
      throws SecurityException, ClassNotFoundException { 
     String name = entry.getName(); 
     if (name.endsWith(CLASS_SUFFIX)) { 
      /** 
      * Populate the class name 
      */ 
      name = name.replaceAll("/", ".") 
        .substring(0, name.lastIndexOf(".")); 

      /** 
      * Retrieve the methods via reflection. 
      */ 
      Method[] methods = Class.forName(name).getDeclaredMethods(); 
      for (Method m : methods) { 
       /** 
       * Print the message in console if the method name is expected. 
       */ 
       if (targetMethodName.equals(m.getName())) { 
        System.out.println(String.format(
          "Method [%s] is included in Class [%s]", 
          targetMethodName, name)); 
        break; 
       } 
      } 

     } 
    } 
} 

が、これはあなたにいくつかのを助けることができると思います。

+0

ありがとうございます。私はLinuxコマンドの答えを受け入れました。しかし、私はあなたの仕事が大好きです。 – smilyface

+0

このメソッドを使用すると問題が発生しました。実際に '.class'が' jar'ファイルに存在していても 'ClassNotFoundException'の例外がスローされます。 – Jie

関連する問題