Чтобы увидеть метод в .class файле, встроенном в jar файл | Является ли это возможным?

У меня есть файл jar, содержащий столько *.class файлов. Мне нужно ПОИСК одного метода (теперь у меня есть только имя метода со мной), в котором файл класса.

Возможно ли это?

4 ответа

Извлеките класс из файла jar, а затем запустите

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

Файл classes.txt будет иметь всю информацию о классах внутри jar. Вы можете найти его для метода.


Вы можете открыть банку в winzip/winrar и декомпилировать файл класса в java файл. В сети есть несколько декомпиляторов


В Eclipse IDE вы можете увидеть method declaration [Но не исходный код]. Откройте Package Explorer --> Referenced libraries [на которые ссылаются в вашем проекте], затем разверните дерево для банки, которое вы хотите увидеть в классах. В окне outline вы можете увидеть объявление метода


Вы можете использовать следующие шаги, чтобы найти все имена классов, которые включают имя целевого метода в файле Jar.

  • Получить записи для указанного файла Jar.
  • Проверьте каждый JarEntry для имен. Если имя заканчивается на .class. Затем введите имя класса.
  • Используйте имя заполненного класса, чтобы получить все методы с помощью отражения.
  • Сравните имя и имя целевого метода. Если они равны, напечатайте имя метода и имя класса в консоли.

Используйте приведенные выше шаги, мы можем найти все имена классов в файле jar с указанным именем целевого метода.

Я написал код и запустил пример поиска имени класса в jar ' commons-lang-2.4.jar' с именем целевого метода removeCauseMethodName.

И в консоли отображается следующее сообщение.

Метод [removeCauseMethodName] включен в класс [org.apache.commons.lang.exception.ExceptionUtils]

Из сообщения мы можем увидеть имя класса, которое включает имя целевого метода.

Код выглядит следующим образом:

Примечание: перед запуском кода нам нужно добавить jar 'commons-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;
 }
 }
 }
 }
}
</jarentry>

Надеюсь, это может вам помочь.

licensed under cc by-sa 3.0 with attribution.