Загрузите класс для отражения, когда он уже загружен из других мест в Java - PullRequest
0 голосов
/ 15 июля 2011

Я пытаюсь написать декомпилятор для Java, используя отражение (все, что мне нужно, это информация о сигнатуре метода из переданного в jar-файл).Я использую URLClassLoader для загрузки классов из файла jar, а затем передаю этот класс своему декомпилятору.

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

ClassLoader myClassLoader = URLClassLoader.newInstance(jars, null);
Class<?> classToDecompile = Class.forName(className, false, myClassLoader);

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

Редактировать:

Фляга I 'm пытается декомпилировать содержит классы в пакете java.lang, который вызывает исключение безопасности:

java.lang.SecurityException: Запрещенное имя пакета: java.lang

Ответы [ 2 ]

3 голосов
/ 15 июля 2011

ClassLoader.loadClass (String, boolean) - который наследует URLClassLoader - сначала проверяет предварительно загруженный класс, а затем, не обнаруживая, проверяет загрузчик родительского класса.Вы можете переопределить этот метод, чтобы обойти проверку ранее загруженного класса.Не уверен, что вам придется обойти родителей.

Имейте в виду, это был бы злой загрузчик классов;вы, вероятно, не должны использовать его для чего-либо еще.

Вы также можете попробовать прочитать jar самостоятельно, получить содержимое файла класса (байтовые коды) и вызвать ClassLoader.defineClass (name, byte [])., int, int) самостоятельно, предоставив уникальное имя для класса.Я думаю, что на самом деле это лучшая идея.

0 голосов
/ 15 июля 2011

Зачем тратить время, когда есть JAD ? Если вы все еще хотите достичь этого, вы должны написать собственный загрузчик классов со стратегией child-first .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...