Гость
Форумы / Java [игнор отключен] [закрыт для гостей] / Загрузить свой класс в чужой класслоадер / 8 сообщений из 8, страница 1 из 1
16.12.2019, 09:24
    #39903283
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузить свой класс в чужой класслоадер
Добрый день!

Есть сгенерированный мной класс в виде byte[] . Есть какой-то класслоадер. Мне надо вкинуть свой код в этот класслоадер.

Сейчас это делается с помощью вызова java.lang.ClassLoader#defineClass(java.lang.String, byte[], int, int) - но это protected метод и jdk 11 при вызове setAccessible пишет All illegal access operations will be denied in a future release .

Какие есть другие способы загрузить свой код в предопределённый класслоадер?

PS: нет, наследовать нельзя- это кодогенерация в maven-плагине.
...
Рейтинг: 0 / 0
16.12.2019, 13:15
    #39903402
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузить свой класс в чужой класслоадер
Alexey Tomin
Добрый день!

Есть сгенерированный мной класс в виде byte[] . Есть какой-то класслоадер. Мне надо вкинуть свой код в этот класслоадер.

Сейчас это делается с помощью вызова java.lang.ClassLoader#defineClass(java.lang.String, byte[], int, int) - но это protected метод и jdk 11 при вызове setAccessible пишет All illegal access operations will be denied in a future release .

Какие есть другие способы загрузить свой код в предопределённый класслоадер?

PS: нет, наследовать нельзя- это кодогенерация в maven-плагине.


Не ну а чего, нормально - загрузил вебапп и из него докинул кода в jboss) Очень странные у вас хотелки, граничащие с УК
...
Рейтинг: 0 / 0
16.12.2019, 13:19
    #39903406
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузить свой класс в чужой класслоадер
Alexey Tomin


PS: нет, наследовать нельзя- это кодогенерация в maven-плагине.


Так и не понял, что будет финальным артефактом и в какое время надо инжектнуть свой код. Кодогенерация работает до компайла, почему код не попадает в джарку? Зачем нужны пляски с класслоадером?
...
Рейтинг: 0 / 0
16.12.2019, 13:38
    #39903419
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузить свой класс в чужой класслоадер
забыл ник
Alexey Tomin


PS: нет, наследовать нельзя- это кодогенерация в maven-плагине.


Так и не понял, что будет финальным артефактом и в какое время надо инжектнуть свой код. Кодогенерация работает до компайла, почему код не попадает в джарку? Зачем нужны пляски с класслоадером?


Кодогенерация вставляет в класс код. Но надо создать ещё inner class'ы, которых вообще не было.
А вот это сейчас реализовано через указанный метод.
Хотя можно подумать, как НЕ создавать inner class'ы, но это дофига работы будет.
...
Рейтинг: 0 / 0
16.12.2019, 13:45
    #39903429
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузить свой класс в чужой класслоадер
Alexey Tomin
забыл ник
пропущено...


Так и не понял, что будет финальным артефактом и в какое время надо инжектнуть свой код. Кодогенерация работает до компайла, почему код не попадает в джарку? Зачем нужны пляски с класслоадером?


Кодогенерация вставляет в класс код. Но надо создать ещё inner class'ы, которых вообще не было.
А вот это сейчас реализовано через указанный метод.
Хотя можно подумать, как НЕ создавать inner class'ы, но это дофига работы будет.

Все равно не понимаю. Что иннер, что не иннер. Если проблема в том что эти файлы как-то создаются уже после компиляции, то значит вы не вовремя вызываете компиляцию. Сначала кодогенерация(кстати опять же непонятно, вам надо создать файлы java с кодом который нужно скомпилировать или уже .class файлы?) потом компиляция - потом упаковка - потом исполнение. Ну вот вообще не вижу проблем. Во время работынад richfaces, мы по темплету генерировали туеву кучу для рендереров, конвертеров, валидаторов и тд, там чуть ли не половина кода была сгенерирована
...
Рейтинг: 0 / 0
16.12.2019, 13:57
    #39903442
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузить свой класс в чужой класслоадер
забыл ник
Все равно не понимаю. Что иннер, что не иннер. Если проблема в том что эти файлы как-то создаются уже после компиляции, то значит вы не вовремя вызываете компиляцию. Сначала кодогенерация(кстати опять же непонятно, вам надо создать файлы java с кодом который нужно скомпилировать или уже .class файлы?) потом компиляция - потом упаковка - потом исполнение. Ну вот вообще не вижу проблем. Во время работынад richfaces, мы по темплету генерировали туеву кучу для рендереров, конвертеров, валидаторов и тд, там чуть ли не половина кода была сгенерирована


Это да, на этапе компиляции. org.apache.maven.plugin.AbstractMojo цепляется на
Код: java
1.
<goal>instrument</goal>

.
При этом добавляется байткод в клас и создаётся дополнительные классы.
При этом сделано через защищённые методы класслоадера.

PS: решил посмотреть как сделано в byte-buddy . Там не то, чтобы setAccessible зовётся, там даже sun.misc.Unsafe через задних проход достаётся.

Вот уж где трэш
...
Рейтинг: 0 / 0
16.12.2019, 14:06
    #39903453
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузить свой класс в чужой класслоадер
...
Рейтинг: 0 / 0
16.12.2019, 14:29
    #39903478
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузить свой класс в чужой класслоадер
забыл ник


Не о том- я ж создаю класс, а не читаю.

Вообще там глобально вводится ограничение на то, что лезть в кишки класс можно либо внутри модуля, либо в модуль, который opens для твоего. Естественно, что java.base не открыт для моего модуля. Да он никому не открыт.

Если же я не указываю модуль, то ошибки нет, но зато есть предупреждение...
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Загрузить свой класс в чужой класслоадер / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]