Чтение байт-кода из пути к классам - PullRequest
0 голосов
/ 28 ноября 2010

Я определил свой собственный загрузчик классов, который должен читать байт-код из пути к классам, улучшать его и определять класс. В моей первоначальной реализации была строка, которая выглядела так:

getResourceAsStream(name.replaceAll("\\.", File.separator)+".class");

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

Какое правильное / принятое решение?

Спасибо!

1 Ответ

0 голосов
/ 28 ноября 2010

Если name - двоичное имя класса, то имя файла ресурса обычно будет:

    separator + name.replaceAll("\\.", separator) + ".class"

. двоичное имя класса является значением, используемым в файлах байт-кодаи возвращается Class.getName().

Обратите внимание, что разделитель имени ресурса не обязательно совпадает с File.separator.Например, если загрузчик классов загружается из файла JAR, то разделитель определяется API файла JAR, а не соглашениями о файловой системе.

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

Наконец, обратите внимание, что я сказал "условно".Теоретически, вы можете реализовать любую схему именования файлов классов, которая вам нравится, при условии, что вы сможете понять, как последовательно выполнять сопоставление.

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