2016-05-06 17 views
0

メソッドの入力の属性を取得しようとしていますが、属性にアクセスするかgetメソッドを使用するためのオプションがなくてもメソッドの入力のみを取得できます。例えばAspectJ Annotationを使用してメソッド入力の属性を取得

ここcloudFileは基本的にファイルを含む多くのものが含まれているクラス、であり、それはcloudFile.getSizeを(使用して、ファイルのサイズを取得することが可能です私のコード

@Around("execution (* *(cloudFile))") 
public Object captureFileAttribute(ProceedingJoinPoint joinPoint) throws Throwable { 
     Object result = joinPoint.proceed(); 
     System.err.println(joinPoint.getArgs()[0]); 
     return result; 
    } 

があります) ; (メソッドを得る)。基本的にはcloudFileクラスには、次のようになります。

public class CloudFile implements Comparable<CloudFile> { 
... 

public CloudFile(CloudFolder folder, File file, FileSyncStatus syncStatus, TrustLevel trustLevel, String checksum) { 
... 
} 
... 
public long getSize() { 
     return size.get(); 
    } 
... 
} 

上記のコードから、私はA.TXTようですが、この場合には(ファイルに含まれる属性にアクセスするオプションを使用せず、唯一のファイルの名前を印刷することができますよ私は5 KBのサイズを取得したいと思います)。 AspectJが渡した引数から変数やメソッドにアクセスする方法はありますか?それを行うオプションはありますか?

public privileged aspect MemberAccessRecipe 
{ 
    /* 
    Specifies calling advice whenever a method 
    matching the following rules gets executed: 

    Class Name: MyClass 
    Method Name: foo 
    Method Return Type: void 
    Method Parameters: an int followed by a String 
    */ 
    pointcut executionOfFooPointCut() : execution(
     void MyClass.foo(int, String)); 

    // Advice declaration 
    after(MyClass myClass) : executionOfFooPointCut() && this(myClass) 
    { 
     System.out.println(
     "------------------- Aspect Advice Logic --------------------"); 
     System.out.println(
     "Accessing the set(float) member of the MyClass object"); 
     System.out.println(
     "Privileged access not required for this method call as it is 
     public"); 
     myClass.setF(2.0f); 
     System.out.println(
     "Using the privileged aspect access to the private f member 
     variable"); 
     System.out.print("The current value of f is: "); 
     System.out.println(myClass.f); 
     System.out.println(
     "Signature: " + thisJoinPoint.getSignature()); 
     System.out.println(
     "Source Line: " + thisJoinPoint.getSourceLocation()); 
     System.out.println(
     "------------------------------------------------------------"); 
    } 
} 

、今私は混乱していますと等しいを見つけよう:私はこのような通常のAspectJ何かで私の質問に答えるために似た何かを発見した

おかげ

UPDATE

AspectJアノテーションで書く。

答えて

1

これを試してみてください:

@Around("execution (* *(fully.qualified.name.CloudFile)) && args(cloudFile)") 
public Object captureFileAttribute(ProceedingJoinPoint joinPoint, CloudFile cloudFile) throws Throwable { 
     Object result = joinPoint.proceed(); 
     System.err.println(cloudFile); 
     return result; 
    } 
+0

を、それは同じことだとしても、それだけでファイルの名前をキャプチャしますがcloudFile –

+0

の内部ではない、関連する方法はそれとしてあなたに同じインスタンスを与えない@IhsanHaikalので、私は推測しますあなたが 'cloudFile'について何も指定しなかったので本当のメソッドに渡されたものはありません。atm –

+0

私は多分あなたに少し助けてくれるかもしれない私の質問を更新しました –

関連する問題