Программно проверить файлы .class
Я работаю над проектом, в котором мы делаем много передачи удаленных объектов между службой Java и клиентами, написанными на других языках. Учитывая наши текущие ограничения, я решил посмотреть, что потребуется для генерации кода на основе существующего Java-класса. В основном мне нужно взять файл .class
(или их коллекцию), разобрать байт-код, чтобы определить все члены данных и, возможно, getters/seters, а затем написать что-то, что может выводить код на другом языке, чтобы создать класс с та же структура.
Я не ищу стандартные декомпиляторы, такие как JAD. Мне нужно взять файл .class
и создать объектную модель его элементов данных и методов. Возможно ли это вообще?
Ответы
Ответ 1
Я использовал BCEL и считаю это довольно неудобным. ASM намного лучше. Он очень широко использует посетителей (что может быть немного запутанным) и не создает объектную модель. Не создание объектной модели оказывается бонусом, поскольку любая модель, которую вы хотите создать, вряд ли будет похожа на буквальную интерпретацию всех данных.
Ответ 2
Я использовал BCEL в прошлом, и он был довольно прост в использовании. Это было несколько лет назад, так что теперь может быть что-то лучше.
Apache Jakarta BCEL
Ответ 3
Из вашего описания это выглядит как простое отражение. Вы можете обнаружить всю статическую структуру класса, а также получить доступ к полям конкретного экземпляра.
Я бы перешел только на BCEL, если вы пытаетесь перевести инструкции метода. (И если это то, что вы пытаетесь автоматизировать, удачи!)
Ответ 4
JAD - это декомпилятор java, который не позволяет программный доступ. Он уже недоступен и, вероятно, не будет работать для новых проектов с байт-кодами Java7.
Ответ 5
Я в шоке, что никто не упомянул ASM. Это лучшая библиотека байт-кода, которую могут купить ваши деньги. Ну, ладно, это бесплатно.
Ответ 6
Я думаю, что javassist может помочь вам.
http://www.jboss.org/javassist/
У меня никогда не было необходимости использовать его, но если вы попробуете, сообщите ли вы нам свои комментарии об этом?
Хотя я думаю, что это больше для обработки байт-кода, чем проверка класса.