非常に多くの* .classファイルを含むjarファイルがあります。私は一つのメソッドを検索する必要があります(私はちょうど今私と一緒にメソッド名を持っています)どのクラスファイル。jarファイルに埋め込まれた.classファイル内のメソッドを表示する|出来ますか ?
それは可能ですか?
非常に多くの* .classファイルを含むjarファイルがあります。私は一つのメソッドを検索する必要があります(私はちょうど今私と一緒にメソッド名を持っています)どのクラスファイル。jarファイルに埋め込まれた.classファイル内のメソッドを表示する|出来ますか ?
それは可能ですか?
はjarファイルからクラスを抽出し、その後classes.txt
ファイルはjarファイル内のクラスに関するすべての情報を持っています
unzip Classes.jar
find -name '*.class' | xargs javap -p > classes.txt
を実行します。メソッドを検索することができます。
OPを検索したり、grepできるようにこれをもう少しスクリプト化できますか? – hexafraction
@hexafraction jarからすべてのクラスを取得するスクリプトを追加しました。 –
ユーザがLinux/Unixシステムを使用していると仮定しています。 – zip
あなたはEclipse IDE
にmethod declaration
[ではなく、ソースコード]を参照してくださいすることができます。 [プロジェクトで参照されている] オープンPackage Explorer --> Referenced libraries
は、あなたがクラスを見てみたいjarファイルのツリーを展開します。 outline
ウィンドウでは、メソッド宣言が表示されます
短くて甘いです。それはEclipse IDEの中にあるので、WindowsまたはUnix/Linuxのどちらでも使用できます。 – user3108703
@ G.Sソリューションに関する情報スクリーンショット。 (私は50名未満の評判から投稿に返信することはできません。[![ここに画像の説明を入力してください](https://i.stack.imgur.com/ls2Ui.jpg)](https:///i.stack.imgur.com/ls2Ui.jpg) – cepix
winzip/winrarでjarを開き、クラスファイルをjavaファイルに逆コンパイルできます。 ネット上で利用可能な複数のデコンパイラがある
いいえ、OPが検索したい、 – hexafraction
次の手順を使用して、Jarファイルにターゲットメソッド名を含むすべてのクラス名を見つけることができます。
上記の手順を使用して、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;
}
}
}
}
}
が、これはあなたにいくつかのを助けることができると思います。
あなたは、メソッドのソースを参照するか、名前だけで検索するのにしようとしていますか? – hexafraction
六分画、ちょうど名前で探す必要があります。 – smilyface