gpt4 book ai didi

java - 调用对应的 set 方法时获取对象值

转载 作者:行者123 更新时间:2023-12-02 01:39:04 25 4
gpt4 key购买 nike

我想使用spring AOP(@Before)获取修改后的对象的值。我有以下类(class):

package com.mypack;
public class Person {
private String id;
private String firstName;
private String lastName;

public String getId() { return id; }
public String getFirstName() { return firstName; }
public String getLastName() { return lastName; }

public void setId(String id) { this.id = id; }
public void setFirstName(String firstName) { this.firstName = firstName; }
public void setLastName(String lastName) { this.lastName = lastName; }
public String toString() { return "Person[" + id + ",
+ firstName + ", " + lastName+ "]"; }
}

详细信息类:

package com.mypack;
public class Details extends Person{

private String address;
private String contactNum;
//getters and setters
public String toString() { return "Details[" + address + ",
" + contactNum+ "]"; }

}

AspectSetterInterceptor 类:

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class AspectSetterInterceptor {
@Before("execution(* com.mypack.Details.set*(*))")
public void before(JoinPoint joinPoint) throws Throwable {
Object[] signatureArgs = joinPoint.getArgs();
for (Object signatureArg : signatureArgs) {
Person obj = (Person) signatureArg;
System.out.println("Before : " + obj.getFirstName() + " ---- "
+ obj.getId());

}

}
}

测试类:

public class ChangeTest {

public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(AspectConfig.class);
ctx.refresh();
//Details userService = ctx.getBean(Details.class);
Details obj1 = new Details();
obj1.setAddress("xx 202");
obj1.setContactNum("2124551234");
obj1.setId("242");
obj1.setFirstName("John");
obj1.setLastName("John");

Details obj2 = new Details();
obj2.setAddress("ASDf 202");
obj2.setContactNum("234544565656");
obj2.setId("23689");
obj2.setFirstName("Sam");
obj2.setLastName("S");

System.out.println("obj1 : " + obj1);
System.out.println("obj2 : " + obj2);

obj2.setFirstName("Samuel");
}

}

也按照此处提到的方式进行了尝试 Spring AOP - get old field value before calling the setter

--已编辑--当执行 ChangeTest 类时,它会打印 obj1 和 obj2 的值(类中重写了 toString() 方法)。它没有命中 AspectSetterInterceptor 中提到的 before(..) 方法。请指教。

PS:我的场景是当有人使用 set*(..) 方法时点击 @Before 方面。在上面的例子中,我给出了一个简单的类Details,它扩展了Person类,所以只要在这些类中调用set*(..)方法,就应该调用aspect @before,类似地,我希望在我的应用程序中任何set**( ..) 方法被调用我想调用@Before。有没有更好的方法可以遵循。TIA。

最佳答案

您在方法 setId(int i) 中接受一个 int,但在 main 方法中您传递一个 String。 obj1.setId("242"); 你所要做的就是传递一个 int obj1.setId(242); 作为旁注,覆盖 toString() 方法,因为您正在执行 System.out.println("obj1 : "+ obj1);,但打印 obj 只是打印它的地址(一堆随机数字和字母) )。

关于java - 调用对应的 set 方法时获取对象值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57499657/

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