|
Загрузить свой класс в чужой класслоадер
|
|||
---|---|---|---|
#18+
Добрый день! Есть сгенерированный мной класс в виде 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-плагине. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 09:24 |
|
Загрузить свой класс в чужой класслоадер
|
|||
---|---|---|---|
#18+
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) Очень странные у вас хотелки, граничащие с УК ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 13:15 |
|
Загрузить свой класс в чужой класслоадер
|
|||
---|---|---|---|
#18+
Alexey Tomin PS: нет, наследовать нельзя- это кодогенерация в maven-плагине. Так и не понял, что будет финальным артефактом и в какое время надо инжектнуть свой код. Кодогенерация работает до компайла, почему код не попадает в джарку? Зачем нужны пляски с класслоадером? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 13:19 |
|
Загрузить свой класс в чужой класслоадер
|
|||
---|---|---|---|
#18+
забыл ник Alexey Tomin PS: нет, наследовать нельзя- это кодогенерация в maven-плагине. Так и не понял, что будет финальным артефактом и в какое время надо инжектнуть свой код. Кодогенерация работает до компайла, почему код не попадает в джарку? Зачем нужны пляски с класслоадером? Кодогенерация вставляет в класс код. Но надо создать ещё inner class'ы, которых вообще не было. А вот это сейчас реализовано через указанный метод. Хотя можно подумать, как НЕ создавать inner class'ы, но это дофига работы будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 13:38 |
|
Загрузить свой класс в чужой класслоадер
|
|||
---|---|---|---|
#18+
Alexey Tomin забыл ник пропущено... Так и не понял, что будет финальным артефактом и в какое время надо инжектнуть свой код. Кодогенерация работает до компайла, почему код не попадает в джарку? Зачем нужны пляски с класслоадером? Кодогенерация вставляет в класс код. Но надо создать ещё inner class'ы, которых вообще не было. А вот это сейчас реализовано через указанный метод. Хотя можно подумать, как НЕ создавать inner class'ы, но это дофига работы будет. Все равно не понимаю. Что иннер, что не иннер. Если проблема в том что эти файлы как-то создаются уже после компиляции, то значит вы не вовремя вызываете компиляцию. Сначала кодогенерация(кстати опять же непонятно, вам надо создать файлы java с кодом который нужно скомпилировать или уже .class файлы?) потом компиляция - потом упаковка - потом исполнение. Ну вот вообще не вижу проблем. Во время работынад richfaces, мы по темплету генерировали туеву кучу для рендереров, конвертеров, валидаторов и тд, там чуть ли не половина кода была сгенерирована ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 13:45 |
|
Загрузить свой класс в чужой класслоадер
|
|||
---|---|---|---|
#18+
забыл ник Все равно не понимаю. Что иннер, что не иннер. Если проблема в том что эти файлы как-то создаются уже после компиляции, то значит вы не вовремя вызываете компиляцию. Сначала кодогенерация(кстати опять же непонятно, вам надо создать файлы java с кодом который нужно скомпилировать или уже .class файлы?) потом компиляция - потом упаковка - потом исполнение. Ну вот вообще не вижу проблем. Во время работынад richfaces, мы по темплету генерировали туеву кучу для рендереров, конвертеров, валидаторов и тд, там чуть ли не половина кода была сгенерирована Это да, на этапе компиляции. org.apache.maven.plugin.AbstractMojo цепляется на Код: java 1.
. При этом добавляется байткод в клас и создаётся дополнительные классы. При этом сделано через защищённые методы класслоадера. PS: решил посмотреть как сделано в byte-buddy . Там не то, чтобы setAccessible зовётся, там даже sun.misc.Unsafe через задних проход достаётся. Вот уж где трэш ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 13:57 |
|
Загрузить свой класс в чужой класслоадер
|
|||
---|---|---|---|
#18+
Может тут что найдешь - https://stackoverflow.com/questions/35785440/access-private-inner-classes-in-java-asm ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 14:06 |
|
Загрузить свой класс в чужой класслоадер
|
|||
---|---|---|---|
#18+
забыл ник Может тут что найдешь - https://stackoverflow.com/questions/35785440/access-private-inner-classes-in-java-asm Не о том- я ж создаю класс, а не читаю. Вообще там глобально вводится ограничение на то, что лезть в кишки класс можно либо внутри модуля, либо в модуль, который opens для твоего. Естественно, что java.base не открыт для моего модуля. Да он никому не открыт. Если же я не указываю модуль, то ошибки нет, но зато есть предупреждение... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 14:29 |
|
|
start [/forum/topic.php?fid=59&msg=39903402&tid=2120982]: |
0ms |
get settings: |
26ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
52ms |
get topic data: |
7ms |
get forum data: |
3ms |
get page messages: |
208ms |
get tp. blocked users: |
1ms |
others: | 323ms |
total: | 640ms |
0 / 0 |