2016-05-06 1 views
0

Я пытаюсь получить некоторые атрибуты ввода метода, но я могу получить вход метода только без какой-либо опции для доступа к атрибутам или с помощью любого метода get.Получить атрибуты ввода метода с использованием AspectJ Annotation

Например вот мой код

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

где cloudFile в основном это класс, который содержит много вещей, в том числе файл и его можно получить размер файла с помощью cloudFile.getSize() ; (метод get). В принципе класс 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 КБ). Есть ли способ доступа к переменным или методам из аргументов, передаваемых AspectJ? Есть ли возможность сделать это?

Благодаря

UPDATE

я нашел что-то подобное, чтобы ответить на мой вопрос в нормальном 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.

ответ

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

Я обновил свой вопрос, может быть, это может помочь вам немного –

Смежные вопросы