2016-09-13 7 views
1

Возможно ли прочитать имя и значение свойства класса в совете Aspectj, имея свойства как точки. Ниже приведен фрагмент кода.Чтение свойства свойства класса и значения в совете Aspectj

JAVA код:

package com.test; 

public class Test { 
    static List<String> list; 
    static List<String> removeList; 
    public static void main(String[] args) { 
     list = new ArrayList<String>(); 
     list.add("ashish"); 
     removeList = new ArrayList<String>(); 
     removeList.add("kumar"); 
    } 
} 

AspectJ код:

package com.test; 

public aspect AspectjTest { 
    pointcut callAdd(): within(com.test.*) && call(* java.util.List.add(..)); 

    boolean around() : callAdd() { 
     //code to get the property name and property value(i.e. the value going to be added to the list) 
     return true; 
    } 
} 

ответ

1

Вы должны связать параметр метода к переменной с помощью args() так:

package com.test; 

import java.util.List; 

public aspect AspectjTest { 
    pointcut callAdd(Object element) : 
     within(com.test.*) && 
     call(boolean List.add(*)) && 
     args(element); 

    boolean around(Object element) : callAdd(element) { 
     System.out.println(thisJoinPoint + " -> " + element); 
     return proceed(element); 
    } 
} 

журнала консоли:

call(boolean java.util.List.add(Object)) -> ashish 
call(boolean java.util.List.add(Object)) -> kumar 

Не стесняйтесь спрашивать о последующих вопросах, если вы этого не понимаете.


Update: Что я имею в виду рефакторинга что-то вроде того, что делает Eclipse, для вас (или любой другой приличной IDE сходным образом) при использовании опции меню «Источник», «Генерировать методы делегата». В результате получается нечто вроде этого:

package com.test; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.stream.Collectors; 
import java.util.stream.Stream; 

public class NameDatabase { 
    private final List<String> firstNames = new ArrayList<String>(); 
    private final List<String> lastNames = new ArrayList<String>(); 

    public boolean addFirstName(String e) { 
     return firstNames.add(e); 
    } 

    public boolean removeFirstName(Object o) { 
     return firstNames.remove(o); 
    } 

    public Stream<String> streamFirstNames() { 
     return firstNames.stream(); 
    } 

    public boolean addLastName(String e) { 
     return lastNames.add(e); 
    } 

    public boolean removeLastName(Object o) { 
     return lastNames.remove(o); 
    } 

    public Stream<String> streamLastNames() { 
     return lastNames.stream(); 
    } 

    public static void main(String[] args) { 
     NameDatabase database = new NameDatabase(); 
     database.addFirstName("Galileo"); 
     database.addLastName("Galilei"); 
     database.addFirstName("Isaac"); 
     database.addLastName("Newton"); 
     database.addFirstName("Albert"); 
     database.addLastName("Einstein"); 
     database.addFirstName("Werner"); 
     database.addLastName("Heisenberg"); 
     database.addFirstName("Stephen"); 
     database.addLastName("Hawking"); 

     database.removeFirstName("Werner"); 
     database.removeLastName("Heisenberg"); 

     System.out.println(database.streamFirstNames().collect(Collectors.joining(", "))); 
     System.out.println(database.streamLastNames().collect(Collectors.joining(", "))); 
    } 
} 

Соответствующий аспект:

package com.test; 

public aspect NameDBContentAuditor { 
    before(String name) : 
     execution(public * NameDatabase.*stName(*)) && 
     args(name) 
    { 
     System.out.println(thisJoinPoint + " -> " + name); 
    } 
} 

журнала консоли:

execution(boolean com.test.NameDatabase.addFirstName(String)) -> Galileo 
execution(boolean com.test.NameDatabase.addLastName(String)) -> Galilei 
execution(boolean com.test.NameDatabase.addFirstName(String)) -> Isaac 
execution(boolean com.test.NameDatabase.addLastName(String)) -> Newton 
execution(boolean com.test.NameDatabase.addFirstName(String)) -> Albert 
execution(boolean com.test.NameDatabase.addLastName(String)) -> Einstein 
execution(boolean com.test.NameDatabase.addFirstName(String)) -> Werner 
execution(boolean com.test.NameDatabase.addLastName(String)) -> Heisenberg 
execution(boolean com.test.NameDatabase.addFirstName(String)) -> Stephen 
execution(boolean com.test.NameDatabase.addLastName(String)) -> Hawking 
execution(boolean com.test.NameDatabase.removeFirstName(Object)) -> Werner 
execution(boolean com.test.NameDatabase.removeLastName(Object)) -> Heisenberg 
Galileo, Isaac, Albert, Stephen 
Galilei, Newton, Einstein, Hawking 
+0

Спасибо за ваш @kriegaex ответ. Но мне нужно получить имя члена класса, т. Е. Ничего, кроме имени списка здесь (ex 'list' и 'removeList'). Пример, который вы указали, сможет получить значения, но здесь, в совете, невозможно узнать, какое значение будет добавлено в список. Поэтому мне нужно имя списка, а также значение, которое нужно добавить. – ashishakp

+0

Нет, нет. Вам необходимо инкапсулировать доступ к этим членам в методах getter/setter и перехватить их через AspectJ другими способами. То, что трудно проследить, что происходит в вашем коде, не является поводом для настройки инструмента, но для рефакторинга. – kriegaex

+0

Я обновил ответ, чтобы показать, что я имею в виду, рефакторинг. – kriegaex

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

  • Нет связанных вопросов^_^