Вы должны связать параметр метода к переменной с помощью args()
так:
package com.test;
import java.util.List;
public aspect AspectjTest {
pointcut callAdd(Object element) :
within(com.test.*) &&
call(boolean List.add(*)) &&
args(element);
boolean around(Object element) : callAdd(element) {
System.out.println(thisJoinPoint + " -> " + element);
return proceed(element);
}
}
журнала консоли:
call(boolean java.util.List.add(Object)) -> ashish
call(boolean java.util.List.add(Object)) -> kumar
Не стесняйтесь спрашивать о последующих вопросах, если вы этого не понимаете.
Update: Что я имею в виду рефакторинга что-то вроде того, что делает Eclipse, для вас (или любой другой приличной IDE сходным образом) при использовании опции меню «Источник», «Генерировать методы делегата». В результате получается нечто вроде этого:
package com.test;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class NameDatabase {
private final List<String> firstNames = new ArrayList<String>();
private final List<String> lastNames = new ArrayList<String>();
public boolean addFirstName(String e) {
return firstNames.add(e);
}
public boolean removeFirstName(Object o) {
return firstNames.remove(o);
}
public Stream<String> streamFirstNames() {
return firstNames.stream();
}
public boolean addLastName(String e) {
return lastNames.add(e);
}
public boolean removeLastName(Object o) {
return lastNames.remove(o);
}
public Stream<String> streamLastNames() {
return lastNames.stream();
}
public static void main(String[] args) {
NameDatabase database = new NameDatabase();
database.addFirstName("Galileo");
database.addLastName("Galilei");
database.addFirstName("Isaac");
database.addLastName("Newton");
database.addFirstName("Albert");
database.addLastName("Einstein");
database.addFirstName("Werner");
database.addLastName("Heisenberg");
database.addFirstName("Stephen");
database.addLastName("Hawking");
database.removeFirstName("Werner");
database.removeLastName("Heisenberg");
System.out.println(database.streamFirstNames().collect(Collectors.joining(", ")));
System.out.println(database.streamLastNames().collect(Collectors.joining(", ")));
}
}
Соответствующий аспект:
package com.test;
public aspect NameDBContentAuditor {
before(String name) :
execution(public * NameDatabase.*stName(*)) &&
args(name)
{
System.out.println(thisJoinPoint + " -> " + name);
}
}
журнала консоли:
execution(boolean com.test.NameDatabase.addFirstName(String)) -> Galileo
execution(boolean com.test.NameDatabase.addLastName(String)) -> Galilei
execution(boolean com.test.NameDatabase.addFirstName(String)) -> Isaac
execution(boolean com.test.NameDatabase.addLastName(String)) -> Newton
execution(boolean com.test.NameDatabase.addFirstName(String)) -> Albert
execution(boolean com.test.NameDatabase.addLastName(String)) -> Einstein
execution(boolean com.test.NameDatabase.addFirstName(String)) -> Werner
execution(boolean com.test.NameDatabase.addLastName(String)) -> Heisenberg
execution(boolean com.test.NameDatabase.addFirstName(String)) -> Stephen
execution(boolean com.test.NameDatabase.addLastName(String)) -> Hawking
execution(boolean com.test.NameDatabase.removeFirstName(Object)) -> Werner
execution(boolean com.test.NameDatabase.removeLastName(Object)) -> Heisenberg
Galileo, Isaac, Albert, Stephen
Galilei, Newton, Einstein, Hawking
Спасибо за ваш @kriegaex ответ. Но мне нужно получить имя члена класса, т. Е. Ничего, кроме имени списка здесь (ex 'list' и 'removeList'). Пример, который вы указали, сможет получить значения, но здесь, в совете, невозможно узнать, какое значение будет добавлено в список. Поэтому мне нужно имя списка, а также значение, которое нужно добавить. – ashishakp
Нет, нет. Вам необходимо инкапсулировать доступ к этим членам в методах getter/setter и перехватить их через AspectJ другими способами. То, что трудно проследить, что происходит в вашем коде, не является поводом для настройки инструмента, но для рефакторинга. – kriegaex
Я обновил ответ, чтобы показать, что я имею в виду, рефакторинг. – kriegaex