2016-01-01 3 views
0

Я новичок с AspectJ, и я пытаюсь сделать это:Определение локальной переменной имя в AspectJ

Допустим, у меня есть 2 объекта: var_obj1, var_obj2.

Они из одного типа: MyObject.

В моем аспекте я использую совет around() по методу toString() на MyObject. Я хочу вернуть имя переменной объекта

Например, если я позвоню toString() на var_obj1, этот метод (на аспекте) должен возвращать: «Привет из var_obj1».

, и если я позвоню toString() по адресу var_obj2, этот метод (по аспекту) должен возвращать: «привет от var_obj2».

Это должно быть сделано без сохранения имени переменной в объекте.

Я ищу решение AspectJ для этого.

Мой текущий код:

public static void main(String[] args) { 
    MyObject var_obj1, var_obj2; 
    var_obj1 = new MyObject(); 
    var_obj2 = new MyObject(); 

    System.out.println(var_obj1.toString()); 
    System.out.println(var_obj2.toString()); 
} 

Формат:

String around(): execution(String com.example.shapes.MyObject.toString()) { 
    var object_var_name = ""; // here we need to put the variable object name 
    return "hello from "+object_var_name; 
} 

ответ

1

То, что вы хотите достичь, это не представляется возможным с AspectJ. Прежде всего, потому что нет pointcut expression для выбора точек соединения, где выполнение метода (или, скорее, метод-вызов) основано на доступе к локальной переменной. Кроме того, вы не должны создавать свою прикладную логику на основе именования или даже использования локальных переменных, метод можно вызвать, не используя локальную переменную вообще. Рассмотрим следующие примеры: были использованы

new MyObject().toString(); 
someOtherObject.getMyObject().toString(); 

Оба совершенно правомерный вызовы toString(), пока нет локальных переменных.

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