Программная проверка файлов .class

Я работаю над проектом, в котором мы выполняем много удаленных передач объектов между службой Java и клиентами, написанными на других языках. Учитывая наши текущие ограничения, я решил посмотреть, что потребуется для генерации кода на основе существующего класса Java. В основном мне нужно взять файл .class (или их набор), проанализировать байт-код, чтобы определить все члены данных и, возможно, геттеры/сеттеры, а затем написать что-то, что может выводить код на другом языке, чтобы создать класс с той же структурой .

Я не ищу стандартные декомпиляторы, такие как JAD. Мне нужно иметь возможность взять файл .class и создать объектную модель его элементов данных и методов. Это вообще возможно?


person Mike Deck    schedule 02.10.2008    source источник


Ответы (6)


Я использовал BCEL и считаю его довольно неудобным. ASM намного лучше. Он очень широко использует посетителей (что может немного сбивать с толку) и не создает объектную модель. Отсутствие создания объектной модели оказывается преимуществом, поскольку любая модель, которую вы хотите создать, вряд ли будет выглядеть как буквальная интерпретация всех данных.

person Tom Hawtin - tackline    schedule 02.10.2008
comment
На самом деле, ASM предоставляет объектную модель, если она вам нужна. См. их Tree API. - person Dave L.; 03.10.2008
comment
После оценки всех перечисленных здесь вариантов ASM определенно является лучшим IMHO для проверки файлов .class. Я согласен с тем, что шаблон посетителя намного чище, чем модель BCEL. Спасибо за совет. - person Mike Deck; 03.10.2008

Я использовал BCEL в прошлом, и он был довольно прост в использовании. Это было несколько лет назад, так что сейчас может быть что-то лучше.

Apache Jakarta BCEL

person Ken    schedule 02.10.2008
comment
Ничего себе, вы на самом деле опередили меня, чтобы ответить на мой собственный вопрос. Это был мой выбор по умолчанию, я собирался задать вопрос и ответить на него сам и посмотреть, есть ли у кого-нибудь идеи получше. Спасибо. - person Mike Deck; 03.10.2008

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

Я бы перешел к BCEL, только если вы пытаетесь перевести инструкции метода. (И если это то, что вы пытаетесь автоматизировать, удачи!)

person erickson    schedule 03.10.2008
comment
Отражение, хотя и возможное решение, далеко не идеальное. Я хочу иметь возможность указывать на произвольный файл .class и деконструировать его. Если бы я использовал отражение, мне пришлось бы заставить Classloader загрузить класс, прежде чем я начал с ним работать. - person Mike Deck; 03.10.2008

Я в шоке, что никто еще не упомянул ASM. Это лучшая библиотека байт-кода, которую можно купить за деньги. Ну ладно бесплатно.

person Alex Miller    schedule 03.10.2008

JAD — это декомпилятор Java, который не разрешает программный доступ. Он больше не доступен и, вероятно, не будет работать для новых проектов с байт-кодами Java7.

person Heath Borders    schedule 03.10.2008
comment
JAD — это декомпилятор, мне нужно что-то, что работает программно. - person Mike Deck; 03.10.2008
comment
Исправил эту ссылку, добавил больше текста. - person Heath Borders; 05.03.2014

Я думаю, что javassist может вам помочь.

http://www.jboss.org/javassist/

У меня никогда не было необходимости использовать его, но если вы попробуете, не могли бы вы сообщить нам свои комментарии по этому поводу?

Хотя я думаю, что это больше для манипулирования байт-кодом, чем для проверки .class.

person OscarRyz    schedule 02.10.2008