通过注解+切面的方式 覆写字段的set方法逻辑,包括接收的参数类型,有原本的int替换成string,原本的set方法作废,举例详细说明
时间: 2024-10-17 16:03:20 浏览: 50
在Java中,我们通常使用注解(Annotations)配合AOP(Aspect Oriented Programming,面向切面编程)来动态修改或增强类的行为,比如这里提到的覆写字段的set方法逻辑。Spring AOP库提供了很好的支持。以下是一个具体的例子:
```java
// 定义一个基础的POJO(Plain Old Java Object)类
public class BaseClass {
@Target(ElementType.FIELD) // 注解应用到字段上
@Retention(RetentionPolicy.RUNTIME) // 保留到运行时
public @interface CustomSet {
String value();
}
private int originalField; // 原始的int类型的field
// 原来的set方法
public void setOriginalField(int value) {
this.originalField = value;
}
}
// 使用CustomSet注解覆盖set方法逻辑的切面类
@Aspect
@Component
public class FieldOverrideAspect {
@Around("@annotation(customSet)")
public Object around(ProceedingJoinPoint joinPoint, CustomSet customSet) throws Throwable {
// 获取原始方法签名
Signature signature = joinPoint.getSignature();
// 检查目标方法是否是set方法
if (signature.getName().startsWith("set") && signature.getParameterTypes()[0] == int.class) {
String newValue = customSet.value(); // 将接收到的字符串转换成int
int intValue = Integer.parseInt(newValue);
joinPoint.proceed(intValue); // 调用增强后的set方法,传入解析后的值
} else {
throw new IllegalArgumentException("Invalid method for annotation customization");
}
}
}
```
在这个例子中,`BaseClass` 的 `originalField` 上添加了 `@CustomSet` 注解,并期望传入的是 `String` 类型而不是 `int`。当我们试图调用这个字段的 `set` 方法时,实际上是触发了 `FieldOverrideAspect` 中的 `around` 方法,它会将接收到的字符串转换成整数再传递给原始的 `set` 方法。
阅读全文