Содержание
Этот урок будет очень интересным . На прошлой неделе я работал над проектом Java, который требует, чтобы у меня был список классов из файла .jar. С помощью JarEntry а также JarInputStream Утилита я смог извлечь все классы изнутри .jar файл.
JarInputStream создает новый JarInputStream и читает необязательный манифест . Если манифест присутствует, также пытается проверить подписи, если JarInputStream подписан.
Решение ниже также будет работать для вас, если у вас есть какой-либо из следующих запросов:
- В Java — Как найти класс где-то внутри десятков файлов JAR
- Как получить имена классов внутри файла JAR ?
- Ищем класс Java в наборе JAR с помощью find
Учебник по отражению Java: как использовать отражение для вызова метода Java во время выполнения
Давайте начнем. Мы выполним следующие шаги.
- Создать класс
CrunchifyFindClassesFromJar.java - Создать служебный метод под названием
getCrunchifyClassNamesFromJar(String jarFileName) - Перебрать nextJarEntry и если найдены удалить .class от имени добавьте его в JSON список
- Распечатать JSONObject, содержащий приведенный выше список классов
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
пакет ком . crunchify. учебник ;
Импортировать Java. Ио. FileInputStream ;
Импортировать Java. Util. баночка. JarEntry ;
Импортировать Java. Util. баночка. JarInputStream ;
Импортировать орг. JSON . JSONArray ;
Импортировать орг. JSON . JSONObject ;
/ **
* @author Crunchify.com
*
* /
общественности учебный класс CrunchifyFindClassesFromJar {
@SuppressWarnings ( ресурс )
общественности статический JSONObject getCrunchifyClassNamesFromJar ( String crunchifyJarName ) {
JSONArray listofClasses знак равно новый JSONArray ( ) ;
JSONObject crunchifyObject знак равно новый JSONObject ( ) ;
пытаться {
JarInputStream crunchifyJarFile знак равно новый JarInputStream ( новый FileInputStream ( crunchifyJarName ) ) ;
JarEntry crunchifyJar ;
в то время как ( правда ) {
crunchifyJar знак равно crunchifyJarFile . getNextJarEntry ( ) ;
если ( crunchifyJar == ноль ) {
перерыв ;
}
если ((CrunchifyJar. GetName (). EndsWith ( .class))) {
строка имя класса знак равно crunchifyJar . getName ( ) . replaceAll ( / , // . ) ;
строка мои занятия знак равно имя класса. подстрока ( 0 , имя класса. lastIndexOf ( '.' ) ) ;
listofClasses . положить ( myClass ) ;
}
}
crunchifyObject . положить ( «Имя файла Jar» , crunchifyJarName ) ;
crunchifyObject . положить ( Список класса , listofClasses ) ;
} ловить ( Исключение е ) {
Система. вне. println ( «Упс. Обнаружена проблема при разборе файла» + эл . toString ( ) ) ;
}
вернуть crunchifyObject ;
}
общественности статический недействительным main ( Строка [ ] аргументы ) {
JSONObject myList знак равно getCrunchifyClassNamesFromJar ( /Users/
Система. вне. println ( myList ) ;
}
}
|
Результат:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
{
«Список класса» : [
javax.el.ArrayELResolver ,
javax.el.BeanELResolver $ BeanProperties ,
javax.el.BeanELResolver $ BeanProperty ,
javax.el.BeanELResolver ,
javax.el.CompositeELResolver $ CompositeIterator ,
javax.el.CompositeELResolver ,
javax.el.ELContext ,
javax.el.ELContextEvent ,
, , , , ,
, , , , , еще много всего . , ,
] ,
«Имя файла Jar» : /Users/
}
|
Бонусный балл:
Проверять, выписываться how to find если конкретная банка содержит конкретный метод.
|
1
2
3
4
5
6
7
|
пытаться {
Класс < ? > crunchifyClass знак равно Класс. forName ( className ) ;
Метод основной знак равно crunchifyClass . getDeclaredMethod ( yourMethodName ) ;
главный. invoke ( null ) ;
} ловить ( Исключение е ) {
эл . printStackTrace ( ) ;
}
|
Надеюсь, эта мини-утилита поможет, если вы хотите быстро достичь той же цели. Не стесняйтесь использовать его в своем производственном проекте .
0.00 (0%) 0 votes










