Почему мой Аспект ничего не делает?

Это простой класс, который является аспектом:

package aspectTest;

import java.awt.Color;

import javax.swing.JLabel;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;


    @Aspect
    public class aspect {
        @Pointcut("execution(static String createMultiLabel(..))")
        public void multilabelCreation() {}

        @Around("multilabelCreation()")
        public String changeLabelColours(ProceedingJoinPoint thisJoinPoint) throws Throwable {

    String st = (String) thisJoinPoint.proceed();
System.out.println("fdfs");
    st = "st"+st;
    return st;
        }


}

и это мой основной класс:

package aspectTest;

import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

public class messagemethod {
    public static String createMultiLabel(final String msg) {

        return msg;
    }
    public static void main(String[] args) {
        String st1 = createMultiLabel("hello");
        System.out.println(st1);

    }
}

это моя папка lib: введите здесь описание изображения

это мой aop.xml:

<aspectj>
    <aspects>

        <aspect name="aspectTest.aspect"/>

</aspects>

</aspectj>

и это моя конфигурация запуска:

введите здесь описание изображения

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


person Community    schedule 03.08.2015    source источник
comment
Execution JoinPoints используют полные квалифицированные методы. Вы пробовали @Pointcut("execution(static javax.swing.JLabel[] createMultiLabel(..))") public void aspectTest.messagemethod.multilabelCreation() {} ?   -  person Serge Ballesta    schedule 03.08.2015
comment
Я попробовал, и никаких различий не произошло! @SergeBallesta   -  person    schedule 03.08.2015
comment
Если я правильно помню, аргумент VM должен быть -javaagent:/path/to/aspectjweaver.jar вместо javaagentlib   -  person Serge Ballesta    schedule 03.08.2015
comment
это javaagent:lib/ , lib является частью моего пути к aspectjweaver @SergeBallesta   -  person    schedule 03.08.2015
comment
Я не вижу, где находится aop.xml в конфигурации вашего проекта. И вы можете попробовать добавить <weaver options="-verbose"/> между </aspects> и </aspectj>, чтобы увидеть переплетение сообщений во время выполнения.   -  person Serge Ballesta    schedule 03.08.2015
comment
куда мне добавить aop.xml? @SergeBallesta   -  person    schedule 03.08.2015
comment
Он должен находиться в папке META-INF.   -  person Serge Ballesta    schedule 03.08.2015
comment
Он у меня в папке meta-inf, картинка не полная. @SergeBallesta   -  person    schedule 03.08.2015
comment
Проблема в том, что когда я просто исправляю небольшие проблемы: aop.xml правильно в папке META-INF, полный путь для -javaagent:, заглавные буквы для классов, я больше не могу воспроизвести ошибку ;-) Ваше приложение должно быть правильным, если это работает неправильно, у вас где-то глупая опечатка, и, не зная точно всего, я не могу помочь вам ее найти (в любом случае, это действительно трудно найти на удаленном экране ...)   -  person Serge Ballesta    schedule 03.08.2015
comment
Я знаю, что это будет глупая ошибка, но я не могу ее найти, я думаю, что рассказал почти все о своем проекте, есть ли что-нибудь еще, что вы хотите знать, чтобы помочь? @SergeBallesta   -  person    schedule 04.08.2015


Ответы (1)


Это работает для меня.

package test;

@Aspect
public class TestAspect {
    public static String createMultiLabel(final String msg) {
        return msg;
    }
    public static void main(String[] args) {
        String st1 = createMultiLabel("hello");
        System.out.println(st1);
    }

    @Around("execution(java.lang.String test.TestAspect.createMultiLabel(java.lang.String))")
    public String aroundCreateMultiLabel(ProceedingJoinPoint joinPoint) throws Throwable {
        System.err.println("in around before " + joinPoint);
        String string = (String) joinPoint.proceed();
        System.err.println("in around after " + joinPoint);
        return string;
    }
}

Возможно, вам нужно переопределить тип вашего проекта на аспектный проект. Сравните с вашим файлом .projects

<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
    <name>Aspects</name>
    <buildSpec>
        <buildCommand>
            <name>org.eclipse.ajdt.core.ajbuilder</name>
        </buildCommand>
    </buildSpec>
    <natures>
        <nature>org.eclipse.ajdt.ui.ajnature</nature>
        <nature>org.eclipse.jdt.core.javanature</nature>
    </natures>
</projectDescription>
person Frank M.    schedule 03.08.2015
comment
снова мой основной класс пишет только одно приветствие в консоли, больше ничего! @Фрэнк М. - person ; 03.08.2015
comment
Я немного запутался, я скопировал ваш .project вместо моего в двух своих проектах, один из них работает нормально, но другой, приведенный выше, снова не работает. @Фрэнк М. - person ; 03.08.2015
comment
@ User333: При всем уважении, вам действительно нужно научиться владеть инструментами разработки AspectJ (AJDT). Многие из ваших вопросов показывают одну и ту же схему: вы задаете одни и те же вещи, люди дают правильные ответы, но вы не можете их использовать, потому что ваш проект настроен неправильно. Таким образом, никто не сможет вам помочь, потому что вы даже не сможете воспроизвести правильные решения. - person kriegaex; 05.08.2015
comment
но я попробовал все предложения и сообщил о результате, и я знаю, что я не профессионал в этом аспекте, но я пытаюсь изучить это, и я думаю, что здесь есть место, где можно спросить и узнать. @kriegaex - person ; 05.08.2015