2016-10-28 9 views
3

@interfaceインスタンス変数をpointcutとメソッドに渡す必要がありますが、Googleでは何も見つかりませんでした。ここ AspectJ - インターフェイスインスタンス変数をポイントカットに渡す

は、私がこれまで持っているものです。

ポイントカット:

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(); 
} 

UPDATED

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; 
    } 
} 
public enum FieldChangeType { 
    ENUM, STRING 
} 

@interface CaptureChangesから 'FieldChangeMethodメソッド'の値を取得し、それをbefore()関数で使用したいと考えています。

どうすればいいですか?

+0

でした'MethodType'と' FieldChangeName'タイプにあなたの質問にソースを追加しますか?投稿したコードが実際にコンパイルされていることを確認してください。 –

+0

@NándorElődFeketeコードがコンパイルされていて、新旧の価値を得ることができます - しかし、私はMethodTypeの価値も得る必要があります – Purmarili

答えて

3

それはあなたがMethodTypeFieldChangeTypeクラスで達成しようとしているものを私には不明ですが、ここではフィールドの値が変更されるとき@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()); 
} 
+0

ありがとう、 – Purmarili

関連する問題