2016-05-06 8 views
0

Ich versuche, einige Attribute der Methode zu erhalten, aber ich bin nur in der Lage, die Eingabe der Methode nur ohne eine Option zum Zugriff auf die Attribute oder verwenden Sie eine get-Methode.Get Method Input-Attribute mit AspectJ Annotation

Zum Beispiel hier ist mein Code

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

wo cloudFile im Grunde eine Klasse, die eine Menge Sachen enthält, einschließlich einer Datei und es ist möglich, die Größe der Datei zu erhalten, indem cloudFile.getSize mit() ; (Methode holen). Grundsätzlich ist die cloudFile Klasse sieht wie folgt aus:

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

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

Aus dem obigen Code Ich bin nur in der Lage, den Namen der Datei, wie a.txt zu drucken, aber ohne Möglichkeit, den Zugriff auf die Attribute, die in der Datei enthalten (in diesem Fall Ich möchte die Größe von 5 KB bekommen). Gibt es eine Möglichkeit, auf die Variablen oder Methoden aus den vom AspectJ übergebenen Argumenten zuzugreifen? Gibt es eine Option, das zu tun?

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

und nun gleich finden Ich bin verwirrt und versuchen:

Dank

UPDATE

Ich habe etwas ähnliches wie meine Frage in normalen AspectJ etwas wie folgt beantworten gefunden Schreiben in AspectJ Annotation.

Antwort

1

Versuchen Sie folgendes:

@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

es ist dasselbe, wie gut ich denke, da sie nur den Namen der Datei erfasst aber nicht die dazugehörigen Methoden innerhalb des cloudFile –

+0

@IhsanHaikal es nicht geben Ihnen die gleiche Instanz wie was wird an die reale Methode übergeben, da Sie nichts über die 'cloudFile' angegeben haben gibt es nicht viel, was ich atm sagen kann –

+0

Ich habe meine Frage aktualisiert vielleicht könnte es Ihnen ein wenig helfen –

Verwandte Themen