您应该通过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
如果您不明白这一点,请随时提出后续问题。
更新:我所说的重构是指当您使用菜单选项“Source”、“Generate delegate methods”时 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