gpt4 book ai didi

java - 读取 Aspectj 建议中的类属性名称和值

转载 作者:行者123 更新时间:2023-11-30 07:09:16 25 4
gpt4 key购买 nike

是否可以在将属性作为切入点的同时读取 Aspectj 建议中的类属性名称和值。下面是代码片段。

JAVA代码:

package com.test;

public class Test {
static List<String> list;
static List<String> removeList;
public static void main(String[] args) {
list = new ArrayList<String>();
list.add("ashish");
removeList = new ArrayList<String>();
removeList.add("kumar");
}
}

AspectJ 代码:

package com.test;

public aspect AspectjTest {
pointcut callAdd(): within(com.test.*) && call(* java.util.List.add(..));

boolean around() : callAdd() {
//code to get the property name and property value(i.e. the value going to be added to the list)
return true;
}
}

最佳答案

您应该通过 args() 将方法参数绑定(bind)到变量,如下所示:

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

如果您不明白,请随时提出后续问题。

<小时/>

更新:我所说的重构类似于当您使用菜单选项“源”、“生成委托(delegate)方法”时 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

关于java - 读取 Aspectj 建议中的类属性名称和值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39470073/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com