Найти класс где-нибудь в десятках файлов JAR?

То, что вы получаете, является ссылкой.

Вам нужно сделать .once ('значение'), чтобы получить снимок по этой ссылке, затем выполнить .val () для этого снимка, чтобы получить данные

async print(key) 
{
  const name = await firebase.database().ref('users/'+key).once('value')
  console.log(name.val()))
}
237
задан Vadim Kotov 10 August 2017 в 23:49
поделиться

8 ответов

Eclipse может это сделать, просто создайте (временный) проект и поместите свои библиотеки в путь к классам проектов. Тогда вы можете легко найти классы.

Еще один инструмент, который мне приходит в голову, - это Java Decompiler. Он может открывать сразу много банок, а также помогает находить классы.

56
ответ дан 23 November 2019 в 03:23
поделиться

В основном, позвольте мне взглянуть на корень возникшей проблемы. Если вы работаете над новым проектом - почему бы не прийти к PM или техническому руководителю и не спросить его - как он отслеживает зависимости?

-2
ответ дан 29 August 2019 в 19:40
поделиться

ClassFinder является программой, это разработано для решения этой проблемы. Это позволяет Вам искать рекурсивно через каталоги и файлы банки для нахождения всех экземпляров класса, соответствующего шаблону. Это записано в Java, не Python. Это имеет хороший GUI, который помогает использовать. И это работает быстро. Этот выпуск предварительно компилируется в выполнимой банке, таким образом, Вы не должны создавать его из источника.

Загрузка это здесь: ClassFinder 1.0

1
ответ дан 23 November 2019 в 03:23
поделиться

Вы можете найти класс в каталоге, полном банок с небольшой оболочкой:

Ищем класс "FooBar":

LIB_DIR=/some/dir/full/of/jarfiles
for jarfile in $(find $LIBDIR -name "*.jar"); do
   echo "--------$jarfile---------------"
   jar -tvf $jarfile | grep FooBar
done
0
ответ дан 23 November 2019 в 03:23
поделиться

Это должно быть:

C:\prog\>scala
Welcome to Scala version 2.7.5.final (Java HotSpot(TM) Client VM, Java 1.6.0_16).
Type in expressions to have them evaluated.
Type :help for more information.

scala> val gu: Array[Byte] = Array(18, 19, 20)
gu: Array[Byte] = Array(18, 19, 20)

Это не является неизменным. Seq будет шагом в этом направлении, даже если это всего лишь черта (как Кристофер упоминает в комментариях), добавляющая конечные последовательности элементов. Список Scala будет неизменным.

затем:

for /R %G in (*.jar) do @jar -tvf "%G" | find "ClassName" > NUL && echo %G

Вот как это работает:

  1. for / R% G в (* .jar) do - цикл по всем файлам JAR, рекурсивный обход каталогов; сохранить имя файла в% G.
  2. @jar -tvf "% G" | - запустить команду Java Archive, чтобы вывести список всех имен файлов в данном архиве и записать результаты в стандартный вывод; символ @ подавляет печать вызова команды.
  3. find "ClassName"> NUL - поиск в стандартном вводе, передаваемом из вывода команды jar, для данного имени класса; это установит ERRORLEVEL в 1, если есть совпадение (в противном случае - 0).
  4. && echo% G - если ERRORLEVEL не равно нулю, запишите файл архива Java имя в стандартный вывод (консоль).
387
ответ дан 23 November 2019 в 03:23
поделиться

Когда я столкнулся с этой проблемой, я не знал об этой утилите, поэтому написал следующее:

public class Main {

    /**
     * 
     */
    private static String CLASS_FILE_TO_FIND =
            "class.to.find.Here";
    private static List<String> foundIn = new LinkedList<String>();

    /**
     * @param args the first argument is the path of the file to search in. The second may be the
     *        class file to find.
     */
    public static void main(String[] args) {
        if (!CLASS_FILE_TO_FIND.endsWith(".class")) {
            CLASS_FILE_TO_FIND = CLASS_FILE_TO_FIND.replace('.', '/') + ".class";
        }
        File start = new File(args[0]);
        if (args.length > 1) {
            CLASS_FILE_TO_FIND = args[1];
        }
        search(start);
        System.out.println("------RESULTS------");
        for (String s : foundIn) {
            System.out.println(s);
        }
    }

    private static void search(File start) {
        try {
            final FileFilter filter = new FileFilter() {

                public boolean accept(File pathname) {
                    return pathname.getName().endsWith(".jar") || pathname.isDirectory();
                }
            };
            for (File f : start.listFiles(filter)) {
                if (f.isDirectory()) {
                    search(f);
                } else {
                    searchJar(f);
                }
            }
        } catch (Exception e) {
            System.err.println("Error at: " + start.getPath() + " " + e.getMessage());
        }
    }

    private static void searchJar(File f) {
        try {
            System.out.println("Searching: " + f.getPath());
            JarFile jar = new JarFile(f);
            ZipEntry e = jar.getEntry(CLASS_FILE_TO_FIND);
            if (e == null) {
                e = jar.getJarEntry(CLASS_FILE_TO_FIND);
                if (e != null) {
                    foundIn.add(f.getPath());
                }
            } else {
                foundIn.add(f.getPath());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
8
ответ дан 23 November 2019 в 03:23
поделиться

Проверить JBoss Tattletale ; хотя я никогда не использовал его лично, похоже, это тот инструмент, который вам нужен.

1
ответ дан 23 November 2019 в 03:23
поделиться

Ко всему вышесказанному следует добавить одно: если у вас нет доступного исполняемого файла jar (он поставляется с JDK, но не с JRE), вы можете использовать unzip (или WinZip или что-то еще), чтобы добиться того же.

0
ответ дан 23 November 2019 в 03:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: