AspectJ pointcut для перехвата класса - PullRequest
0 голосов
/ 02 ноября 2018

Ребята, мне нужен разрез, который фильтрует вызываемую функцию по определенному классу.

public aspect intLogin {
    private capture c = new capture();
    pointcut login() : execution(public * login(..)) 
    before ():login(){
        c.print();
    }
}

Это мой аспект, я хочу знать, какую функцию входа в систему вызывают классы. Вы можете мне помочь?

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

вспомогательный класс, вызываемый всеми остальными:

package de.scrum_master.app;

public class Other {
  public void doOther() {}
}

Приложение драйвера со всеми видами внутренних классов:

Здесь мы имеем

  • нестатический внутренний класс,
  • статический внутренний класс,
  • локальный внутренний класс,
  • анонимный класс
  • и, конечно, нормальный класс.
package de.scrum_master.app;

public class Application {
  public String foo(int number) {
    new Other().doOther();
    return "foo";
  }

  public class MyInner {
    public void doSomething() {
      new Other().doOther();
    }
  }

  public static class MyStaticInner {
    public void doSomethingElse() {
      new Other().doOther();
    }
  }

  public static void main(String[] args) {
    new Application().foo(11);
    new Application().new MyInner().doSomething();
    new Application.MyStaticInner().doSomethingElse();

    class LocalInner {
      public void doWhatever() {
        new Other().doOther();
      }
    }
    new LocalInner().doWhatever();

    new Runnable() {
      @Override public void run() {
        new Other().doOther();
      }
    }.run();
  }
}

Имена классов вызывающего журнала регистрации:

package de.scrum_master.aspect;

public aspect CallingClassLogger {
  before(Object caller) : !within(CallingClassLogger) && call(* *(..)) && this(caller) {
    System.out.println(caller.getClass().getName());
  }
}

Журнал консоли:

de.scrum_master.app.Application
de.scrum_master.app.Application$MyInner
de.scrum_master.app.Application$MyStaticInner
de.scrum_master.app.Application$1LocalInner
de.scrum_master.app.Application$1

Ваш аспект напечатал бы что-то вроде

Application.java:5
Application.java:11
Application.java:17
Application.java:28
Application.java:35

, что не очень полезно для ИМО, если вас интересуют имена классов.

0 голосов
/ 08 ноября 2018

Я решил проблему с помощью thisJoinPoint.getSourceLocation (). Код:

public aspect intLogin {
  private capture c = new capture();
  pointcut login(Object a) : call(public * login(..)) && (target(a)) && this(capture);
  before (Object x):login( spring.aop.so_52992365.intLogin) {
    String xString = x.toString();
    System.out.println("The class that is calling the function is:" + thisJoinPoint.getSourceLocation());
    c.print();
  }
}
...