Java AspectJ-将接口实例变量传递给切入点

Java AspectJ-将接口实例变量传递给切入点,java,aop,aspectj,Java,Aop,Aspectj,我需要将@interface实例变量值传递给切入点和方法,但在google上找不到任何东西 以下是我到目前为止的情况: 切入点: pointcut auditField(Object t, Object value): set(@ge.shemo.anotations.CaptureChanges * * ) && args(value) && target(t); before (Object target, Object newValue, FieldCha

我需要将@interface实例变量值传递给切入点和方法,但在google上找不到任何东西

以下是我到目前为止的情况:

切入点:

pointcut auditField(Object t, Object value): set(@ge.shemo.anotations.CaptureChanges * * ) && args(value) && target(t);

before (Object target, Object newValue, FieldChangeName fieldName): 
        auditField(target, newValue,fieldName) {
    FieldSignature sig = (FieldSignature) thisJoinPoint.getSignature();
    Field field = sig.getField();
    field.setAccessible(true);
    Object oldValue;
    try {
        oldValue = field.get(target);
    } catch (IllegalAccessException e) {
        throw new RuntimeException("Failed to create audit Action", e);
    }
    System.out.println("changed from " + oldValue + " to " + newValue);
}
和接口:

@Retention(RUNTIME)
@Target(value = FIELD)
public @interface CaptureChanges {
    MethodType fieldType();
}
已更新

public enum MethodType {
    NAME(FieldChangeType.STRING),
    ID(FieldChangeType.STRING),
    FIRST_NAME(FieldChangeType.STRING),
    LAST_NAME(FieldChangeType.STRING);

    private FieldChangeType type;

    private FieldChangeName(FieldChangeType type) {
        this.type = type;
    }

    public FieldChangeType getType() {
        return this.type;
    }
}
我想从@interface CaptureChanges获取'FieldChangeMethod'的值,并在before()函数中使用它


我怎样才能做到这一点?

虽然我不清楚您试图用
MethodType
FieldChangeType
类实现什么,但在字段值即将更改时,有一种方法可以访问
@CaptureChanges
注释的值:

pointcut auditField(Object t, Object value, CaptureChanges captureChanges): 
    set(* *) && @annotation(captureChanges) && args(value) && target(t);

before (Object target, Object newValue, CaptureChanges captureChanges): 
        auditField(target, newValue, captureChanges) {

    FieldSignature sig = (FieldSignature) thisJoinPoint.getSignature();
    Field field = sig.getField();
    field.setAccessible(true);
    Object oldValue;
    try {
        oldValue = field.get(target);
    } catch (IllegalAccessException e) {
        throw new RuntimeException("Failed to create audit Action", e);
    }
    System.out.println("changed from " + oldValue + " to " + newValue 
            + ", fieldType=" + captureChanges.fieldType()
            + ", fieldChangeType=" + captureChanges.fieldType().getType());
}

能否将源添加到问题的
MethodType
FieldChangeName
类型中?请确保您发布的代码确实编译。@NándorElődFekete代码正在编译,我可以获得新值和旧值-但我也需要获得MethodType的值谢谢,这正是我需要的
pointcut auditField(Object t, Object value, CaptureChanges captureChanges): 
    set(* *) && @annotation(captureChanges) && args(value) && target(t);

before (Object target, Object newValue, CaptureChanges captureChanges): 
        auditField(target, newValue, captureChanges) {

    FieldSignature sig = (FieldSignature) thisJoinPoint.getSignature();
    Field field = sig.getField();
    field.setAccessible(true);
    Object oldValue;
    try {
        oldValue = field.get(target);
    } catch (IllegalAccessException e) {
        throw new RuntimeException("Failed to create audit Action", e);
    }
    System.out.println("changed from " + oldValue + " to " + newValue 
            + ", fieldType=" + captureChanges.fieldType()
            + ", fieldChangeType=" + captureChanges.fieldType().getType());
}