Аспект ткацтва під час виконання

Я шукаю рішення Java, яке дозволить мені використовувати AOP для того, щоб вставити новий код у верхній частині вже запущеного коду під час виконання. Ключ не вимагає перезапуску JVM. Крім того, я хотів би видалити сплетений під час виконання, залишаючи старий код таким, яким воно було раніше, ніж ткати.

Я маю на увазі, що час завантаження AspectJ + виконання завантаження/розвантаження класу виконання буде це робити. Хто-небудь намагався це? Будь-які рекомендації? Дякую.

4
Я знаю, що це старе, але все одно в списку не віднесено до відповіді. Чи могли б ви, будь ласка, прийняти і оновити мою відповідь, якщо це здається правильним? Дякую.
додано Автор kriegaex, джерело
Я знаю, що це старе, але все одно в списку не віднесено до відповіді. Чи могли б ви, будь ласка, прийняти і оновити мою відповідь, якщо це здається правильним? Дякую.
додано Автор kriegaex, джерело

6 Відповіді

Кілька речей, які слід враховувати:

  • Справді, ви можете виконати LTW під час завантаження класу , але не після класу вже завантажено.
  • Таке поняття, як розвантаження класу, не існує, тому що для класу, який вивантажується, його потрібно збирати зі сміття, і для цього більше ніяких посилань на клас не повинно існувати. Навіть якщо це було так, специфікація JVM AFAIK оголошує його необов'язково чи ні, а при розвантаженні або GC повинен очистити вже завантажений клас. Ви ніколи не зможете покладатися на це.

Сказавши це, ви можете спробувати такі поняття, як OSGi, або написати власного завантажувача класів (або знайти один з багатьох існуючих в Інтернеті), який завантажує кожен клас або кожен JAR в окремий приклад завантажувача класів. Це може стати як завгодно складним, тому, можливо, ви хочете розглянути цей простий підхід, якщо він знаходиться в технічних межах вашої ситуації:

  • Скомпонуйте свої аспекти у ваш код або використовуйте LTW, це не має значення. Просто переконайтеся, що аспектний код сплетений перед використанням класів. Очевидно, що час компіляції більше, ніж досить скоро, час завантаження ледве досить скоро, але добре.
  • Використовуйте пункти if() для всіх відповідних порад та забезпечте засоби для динамічного зміни вартості змінної, яка використовується вказівками, щоб мати змогу динамічно перемикати та вимикати консультації. Накладні витрати зазвичай будуть мінімальними, не хвилюйтеся. Просто спробуйте це, перш ніж сказати, що це занадто дорого.

Це рішення задовольняє вашим умовам, що його можна (ди) активізувати динамічно, і що після повного зшивання аспектного коду не потрібно перезавантаження JVM.

8
додано
Hm, я думаю, що розробники несуть відповідальність. Основні кодекси несуть відповідальність за основний код, а розробники аспектів несуть відповідальність за скріплюючі проблеми. Отже, я думаю, це не дуже багато запитує. У будь-якому випадку, просто тому, що ви зробили мене цікавим, я дав JRebel швидку спробу минулих вихідних і використовувати його з AspectJ. Це чудово працювало під час компіляції, але я не міг працювати протягом 5 хвилин (це мало що означає багато) з часовим переплетенням. Це хороший інструмент для розробників, але я не впевнений, що я буду використовувати його у виробництві.
додано Автор kriegaex, джерело
Що ж, це ставить відповідальність перед розробником, щоб написати аспекти, які можна включити/вимкнути. І я хотів би уникнути цього.
додано Автор Faustas, джерело
Я думав про використання JRebel або будь-якого іншого інструменту класу перезавантаження на час виконання. Оскільки класи завантажуються під час виконання, моє припущення полягає в тому, що це дозволить повторно перефарбувати при повторному завантаженні.
додано Автор Faustas, джерело

Кілька речей, які слід враховувати:

  • Справді, ви можете виконати LTW під час завантаження класу , але не після класу вже завантажено.
  • Таке поняття, як розвантаження класу, не існує, тому що для класу, який вивантажується, його потрібно збирати зі сміття, і для цього більше ніяких посилань на клас не повинно існувати. Навіть якщо це було так, специфікація JVM AFAIK оголошує його необов'язково чи ні, а при розвантаженні або GC повинен очистити вже завантажений клас. Ви ніколи не зможете покладатися на це.

Сказавши це, ви можете спробувати такі поняття, як OSGi, або написати власного завантажувача класів (або знайти один з багатьох існуючих в Інтернеті), який завантажує кожен клас або кожен JAR в окремий приклад завантажувача класів. Це може стати як завгодно складним, тому, можливо, ви хочете розглянути цей простий підхід, якщо він знаходиться в технічних межах вашої ситуації:

  • Скомпонуйте свої аспекти у ваш код або використовуйте LTW, це не має значення. Просто переконайтеся, що аспектний код сплетений перед використанням класів. Очевидно, що час компіляції більше, ніж досить скоро, час завантаження ледве досить скоро, але добре.
  • Використовуйте пункти if() для всіх відповідних порад та забезпечте засоби для динамічного зміни вартості змінної, яка використовується вказівками, щоб мати змогу динамічно перемикати та вимикати консультації. Накладні витрати зазвичай будуть мінімальними, не хвилюйтеся. Просто спробуйте це, перш ніж сказати, що це занадто дорого.

Це рішення задовольняє вашим умовам, що його можна (ди) активізувати динамічно, і що після повного зшивання аспектного коду не потрібно перезавантаження JVM.

8
додано
Hm, я думаю, що розробники несуть відповідальність. Основні кодекси несуть відповідальність за основний код, а розробники аспектів несуть відповідальність за скріплюючі проблеми. Отже, я думаю, це не дуже багато запитує. У будь-якому випадку, просто тому, що ви зробили мене цікавим, я дав JRebel швидку спробу минулих вихідних і використовувати його з AspectJ. Це чудово працювало під час компіляції, але я не міг працювати протягом 5 хвилин (це мало що означає багато) з часовим переплетенням. Це хороший інструмент для розробників, але я не впевнений, що я буду використовувати його у виробництві.
додано Автор kriegaex, джерело
Що ж, це ставить відповідальність перед розробником, щоб написати аспекти, які можна включити/вимкнути. І я хотів би уникнути цього.
додано Автор Faustas, джерело
Я думав про використання JRebel або будь-якого іншого інструменту класу перезавантаження на час виконання. Оскільки класи завантажуються під час виконання, моє припущення полягає в тому, що це дозволить повторно перефарбувати при повторному завантаженні.
додано Автор Faustas, джерело

Кілька речей, які слід враховувати:

  • Справді, ви можете виконати LTW під час завантаження класу , але не після класу вже завантажено.
  • Таке поняття, як розвантаження класу, не існує, тому що для класу, який вивантажується, його потрібно збирати зі сміття, і для цього більше ніяких посилань на клас не повинно існувати. Навіть якщо це було так, специфікація JVM AFAIK оголошує його необов'язково чи ні, а при розвантаженні або GC повинен очистити вже завантажений клас. Ви ніколи не зможете покладатися на це.

Сказавши це, ви можете спробувати такі поняття, як OSGi, або написати власного завантажувача класів (або знайти один з багатьох існуючих в Інтернеті), який завантажує кожен клас або кожен JAR в окремий приклад завантажувача класів. Це може стати як завгодно складним, тому, можливо, ви хочете розглянути цей простий підхід, якщо він знаходиться в технічних межах вашої ситуації:

  • Скомпонуйте свої аспекти у ваш код або використовуйте LTW, це не має значення. Просто переконайтеся, що аспектний код сплетений перед використанням класів. Очевидно, що час компіляції більше, ніж досить скоро, час завантаження ледве досить скоро, але добре.
  • Використовуйте пункти if() для всіх відповідних порад та забезпечте засоби для динамічного зміни вартості змінної, яка використовується вказівками, щоб мати змогу динамічно перемикати та вимикати консультації. Накладні витрати зазвичай будуть мінімальними, не хвилюйтеся. Просто спробуйте це, перш ніж сказати, що це занадто дорого.

Це рішення задовольняє вашим умовам, що його можна (ди) активізувати динамічно, і що після повного зшивання аспектного коду не потрібно перезавантаження JVM.

8
додано
Hm, я думаю, що розробники несуть відповідальність. Основні кодекси несуть відповідальність за основний код, а розробники аспектів несуть відповідальність за скріплюючі проблеми. Отже, я думаю, це не дуже багато запитує. У будь-якому випадку, просто тому, що ви зробили мене цікавим, я дав JRebel швидку спробу минулих вихідних і використовувати його з AspectJ. Це чудово працювало під час компіляції, але я не міг працювати протягом 5 хвилин (це мало що означає багато) з часовим переплетенням. Це хороший інструмент для розробників, але я не впевнений, що я буду використовувати його у виробництві.
додано Автор kriegaex, джерело
Що ж, це ставить відповідальність перед розробником, щоб написати аспекти, які можна включити/вимкнути. І я хотів би уникнути цього.
додано Автор Faustas, джерело
Я думав про використання JRebel або будь-якого іншого інструменту класу перезавантаження на час виконання. Оскільки класи завантажуються під час виконання, моє припущення полягає в тому, що це дозволить повторно перефарбувати при повторному завантаженні.
додано Автор Faustas, джерело

Аспект

An aspect is the cross-cutting functionality you are implementing. It is the aspect, or area, of your application you are modularizing. The most common (albeit simple) example of an aspect is logging. Logging is something that is required throughout an application. However, because applications tend to be broken down into layers based on functionality, reusing a logging module through inheritance

не має сенсу. Тим не менш, ви можете створити аспект ведення журналу та застосувати його у всій своїй програмі, використовуючи AOP.


Ткацтво

Weaving is the process of applying aspects to a target object to create a new, proxied object. The aspects are woven into the target object at the specified joinpoints. The weaving can take place at several points in the target class’s lifetime:

  • Compile time :Aspects are woven in when the target class is compiled. This requires a special compiler.
  • Classload time :Aspects are woven in when the target class is loaded into the JVM. This requires a special ClassLoader that enhances that target class’s bytecode before the class is introduced into the application.
  • Runtime :Aspects are woven in sometime during the execution of the application. Typically, an AOP container will dynamically generate a proxy class that will delegate to the target class while weaving in the aspects.

enter image description here
enter image description here

(джерело)

6
додано
Це фактично не вирішує питання. Це просто загальна інформація про AOP.
додано Автор Dennis, джерело

Аспект

An aspect is the cross-cutting functionality you are implementing. It is the aspect, or area, of your application you are modularizing. The most common (albeit simple) example of an aspect is logging. Logging is something that is required throughout an application. However, because applications tend to be broken down into layers based on functionality, reusing a logging module through inheritance

не має сенсу. Тим не менш, ви можете створити аспект ведення журналу та застосувати його у всій своїй програмі, використовуючи AOP.


Ткацтво

Weaving is the process of applying aspects to a target object to create a new, proxied object. The aspects are woven into the target object at the specified joinpoints. The weaving can take place at several points in the target class’s lifetime:

  • Compile time :Aspects are woven in when the target class is compiled. This requires a special compiler.
  • Classload time :Aspects are woven in when the target class is loaded into the JVM. This requires a special ClassLoader that enhances that target class’s bytecode before the class is introduced into the application.
  • Runtime :Aspects are woven in sometime during the execution of the application. Typically, an AOP container will dynamically generate a proxy class that will delegate to the target class while weaving in the aspects.

enter image description here
enter image description here

(джерело)

6
додано
Це фактично не вирішує питання. Це просто загальна інформація про AOP.
додано Автор Dennis, джерело

Аспект

An aspect is the cross-cutting functionality you are implementing. It is the aspect, or area, of your application you are modularizing. The most common (albeit simple) example of an aspect is logging. Logging is something that is required throughout an application. However, because applications tend to be broken down into layers based on functionality, reusing a logging module through inheritance

не має сенсу. Тим не менш, ви можете створити аспект ведення журналу та застосувати його у всій своїй програмі, використовуючи AOP.


Ткацтво

Weaving is the process of applying aspects to a target object to create a new, proxied object. The aspects are woven into the target object at the specified joinpoints. The weaving can take place at several points in the target class’s lifetime:

  • Compile time :Aspects are woven in when the target class is compiled. This requires a special compiler.
  • Classload time :Aspects are woven in when the target class is loaded into the JVM. This requires a special ClassLoader that enhances that target class’s bytecode before the class is introduced into the application.
  • Runtime :Aspects are woven in sometime during the execution of the application. Typically, an AOP container will dynamically generate a proxy class that will delegate to the target class while weaving in the aspects.

enter image description here
enter image description here

(джерело)

6
додано
Це фактично не вирішує питання. Це просто загальна інформація про AOP.
додано Автор Dennis, джерело
ІТ КПІ - Java
ІТ КПІ - Java
436 учасників