Доступ к классу байтов? - PullRequest
       1

Доступ к классу байтов?

3 голосов
/ 04 августа 2011

Моя цель - получить доступ к байту [], представляющему байт-код класса, без особого знания местоположения файлов класса во время выполнения.

Я рассмотрел два решения и смог добиться небольшого успехаодного из них, но мне было интересно, могут ли быть другие способы сделать это (или как я ошибся во втором решении, которое я не смог заставить работать).

Мой первый (слегка) успешныйРешением было использование класса java.lang.instrumentation ClassFileTransformer для доступа к байту [] классов.Несмотря на это, я предположил, что для этого должен быть более понятный способ.

Мое второе решение состояло в том, чтобы использовать JVM-аргумент -Xbootclasspath для замены java.lang.ClassLoader своим собственным, позволяя ему иметь доступбайт [] загруженных классов.Я добавил простое отладочное сообщение System.out.println, чтобы подтвердить, что переопределение ClassLoader работает, но это не так.Я получил эту идею из этой статьи на ту же тему.Мой класс был создан аналогично тому, как класс Integer был переделан в связанной статье.Я также использовал аналогичную настройку каталога для аргумента JVM, который выглядел примерно так:

java -Xbootclasspath/p:.\out\production\boot\java\lang TestLoader

Я думаю, что класс ClassLoader определенно не может быть переопределен с использованием метода в статье, которую я связал.

Мне было бы интересно узнать, почему моя попытка переопределения ClassLoader не сработала, а также услышать, что еще я могу сделать, чтобы получить доступ к байту [] классов.

Ответы [ 3 ]

4 голосов
/ 04 августа 2011

Не могли бы вы просто прочитать байты класса с помощью getResourceAsStream ()?

InputStream is = String.class.getResourceAsStream("String.class");

Изменить, добавив альтернативу:

(скопировано из комментария)

Учитывая все возможности, которыедолжны быть покрыты, ClassFileTransformer и API инструментовки может быть путь.Я не знаю, каковы требования для «чистого», но если проблема заключается в том, чтобы указать аргументы командной строки для JVM, вы можете попробовать использовать Attach API - вы можете подключиться к уже работающему Javaобработайте, вставьте ваш ClassFileTransformer и посмотрите на все классы, уже загруженные в JVM, а также все классы, загруженные после этого.

0 голосов
/ 04 августа 2011

Я думаю, вы просто неправильно указали путь к классу загрузки.Предполагая, что classfile загрузчика классов:

.\out\production\boot\java\lang\ClassLoader.class

, вы должны использовать:

java -Xbootclasspath/p:.\out\production\boot TestLoader
0 голосов
/ 04 августа 2011

Единственное объяснение, которое я смог найти, было на французском языке, но код все еще на языке Java. :)

http://www.google.ca/url?sa=t&source=web&cd=2&ved=0CCEQFjAB&url=http%3A%2F%2Fdeptinfo.unice.fr%2F~renevier%2Farchilog%2Fcours02-chargementDynamique-4p.pdf&rct=j&q=jvm%20define%20class%20loader&ei=Bv05ToKZFcaksQLSs-TDAg&usg=AFQjCNHnjhZbR-A1KWRppvyBP3n_XbrdMA

Страницы 1-8 объясняют, как создать загрузчик классов, и дают хорошую идею для получения байтов из файлов классов.

С уважением, Stéphane

...