Плетение времени загрузки классов javax.swing. * С AspectJ - PullRequest
6 голосов
/ 11 февраля 2012

Я использую AspectJ для отслеживания вызовов графического класса.До сих пор я использовал предварительно сплетенный набор классов javax.swing. *, И при загрузке я говорю JVM использовать эти сплетенные классы, а не классы из JRE, используя ключ -Xbootclasspath / p.

Iхотел бы перейти в режим ткачества времени загрузки.Может кто-нибудь помочь мне, как сплести javax.swing на время загрузки.Я искал в сети, но до сих пор не могу понять, как это сделать.Я знаю, что по умолчанию, AspectJ Weaver времени загрузки не будет соткать java. * И javax. * Классы.Кто-то предложил использовать

-Xset: weaveJavaPackages = true, weaveJavaxPackages = true

в aop.xml, но ничего из этого не помогло, поскольку классы javax.swing загружаются до того, как ткач загружен в загрузчик классов.Я предполагаю, что ткач вообще не видит эти классы.

Как мне удается динамически создавать классы javax.swing?Должен ли я реализовать специальный загрузчик классов, который сначала регистрирует ткач, а затем выполняет загрузку классов?

Может кто-нибудь предложить какое-нибудь решение?

Ответы [ 3 ]

2 голосов
/ 21 октября 2014

Единственное решение, которое я могу предложить, если вам нужно использовать execution() pointcuts для javax пакетов, - это двоичное переплетение tools.jar JRE и создание вашей собственной тканой версии.Я делал это в прошлом, это работало хорошо.Но это только вариант, если вы контролируете среду выполнения вашего приложения.

Если вы не хотите использовать такой подход, вам придется прибегнуть к call() pointcuts.Таким образом, вы можете перехватывать звонки, сделанные вашим собственным приложением или любыми сторонними библиотеками, затронутыми LTW.Только вызовы, сделанные классами JRE, загруженными загрузчиком загрузчиков классов, будут избегать вашего аспекта, который не должен быть слишком плохим.

1 голос
/ 25 апреля 2013

Я ни в коем случае не эксперт, но пока это выглядит многообещающе:

Настройка ткачества времени загрузки с файлами aop.xml

В частности:

<aspectj>
  <aspects>
    ...
  </aspects>
  <weaver options="-verbose">
    <!-- Weave types that are within the javax.* or org.aspectj.*
         packages. Also weave all types in the foo package that do
         not have the @NoWeave annotation. -->
    <include within="javax.*"/>
    <include within="org.aspectj.*"/>
    <include within="(!@NoWeave foo.*) AND foo.*"/>
    ... 
  </weaver>
</aspectj>

Я не уверен, как это могло бы работать, учитывая ClassPreProcessor, используемый агентом LTW (хотя я не пробовал это). Вот начало его preProcess метода:

public byte[] preProcess(String className, byte[] bytes, ClassLoader loader, ProtectionDomain protectionDomain) {
    if (loader == null || className == null || loader.getClass().getName().equals(deleLoader)) {
        // skip boot loader, null classes (hibernate), or those from a reflection loader
        return bytes;
    }
    ...
    try {
        synchronized (loader) {
            ...
            WeavingAdaptor weavingAdaptor = WeaverContainer.getWeaver(loader, weavingContext);
            ...
        }
    }
}

Что делает довольно ясным, как пропускаются классы загрузчика. Кроме того, вызов WeaverContainer.getWeaver() - это то, что запускает обработку aop.xml, и это происходит только после обработки класса с ненулевым загрузчиком.

Не уверен, насколько это помогает с фактическим решением, но, надеюсь, это проливает некоторый свет на то, почему вещи ведут себя так, как они ...

0 голосов
/ 20 октября 2014

Точно вы на полпути. Это не так сложно, довольно просто.

<?xml version="1.0" encoding="UTF-8"?>
 <aspectj>
  <aspects>
 <aspect name="com.ciena.EDTCheck"/>
 </aspects>
    <weaver options="-Xset:weaveJavaxPackages=true -verbose">    
    </weaver>
  </aspectj>

Убедитесь, что у вас есть

aspectjweaver.jar в javaagent, как -javaagent: C: \ aspectj1.8 \ lib \ aspectjweaver.jar

также убедитесь, что ваш файл aop.xml выше находится в папке META-INF

, и все это для запуска из Eclipse или некоторой IDE

если вы хотите запустить из командной строки, убедитесь, что вы также указали -javagaent

...