Программно проверять файлы .class
-
03-07-2019 - |
Вопрос
Я работаю над проектом, в котором мы выполняем много удаленной передачи объектов между службой Java и клиентами, написанными на других языках. Учитывая наши текущие ограничения, я решил посмотреть, что потребуется для генерации кода на основе существующего класса Java. По сути, мне нужно взять файл .class
(или его коллекцию), проанализировать байт-код, чтобы определить все члены данных и, возможно, получатели / установщики, а затем написать что-то, что может выводить код на другом языке. создать класс с такой же структурой.
Я не ищу стандартные декомпиляторы, такие как JAD. Мне нужно иметь возможность взять файл .class
и создать объектную модель его членов данных и методов. Возможно ли это вообще?
Решение
Я использовал BCEL и считаю его довольно неловким. ASM намного лучше. Он очень широко использует посетителей (что может немного смущать) и не создает объектную модель. Не создание объектной модели оказывается бонусом, поскольку любая модель, которую вы хотите создать, вряд ли будет выглядеть буквально как интерпретация всех данных.
Другие советы
Я использовал BCEL в прошлом, и его было довольно просто использовать. Это было несколько лет назад, поэтому сейчас может быть что-то лучше.
По вашему описанию это звучит как простого отражения будет достаточно. Вы можете обнаружить всю статическую структуру класса, а также получить доступ к полям конкретного экземпляра.
Я бы перешел к BCEL, только если вы пытаетесь перевести инструкции метода. (И если это то, что вы пытаетесь автоматизировать, удачи!)
Я шокирован тем, что никто еще не упомянул ASM . Это лучшая библиотека байт-кодов, которую можно купить за ваши деньги. Ну, хорошо, это бесплатно. Р>
JAD - это декомпилятор Java, который не разрешает программный доступ. Он больше недоступен и, вероятно, не будет работать для новых проектов с байт-кодами Java7.
Я думаю, что javassist может вам тоже помочь. Р>
http://www.jboss.org/javassist/
У меня никогда не было необходимости его использовать, но если вы попробуете, дайте нам знать ваши комментарии об этом?
Хотя я думаю, что это больше для манипулирования байт-кодом, чем для проверки .class.