2016-09-08 4 views
4

В следующем фрагменте кода мне нужно выполнить некоторую логику всякий раз, когда доступно свойство myList. Является ли это возможным?Как перехватить статическое свойство в классе java с помощью AspectJ?

public class Test { 
    public static List<String> myList = new ArrayList(); 

    public static void addData(){ 
     myList.add("foo"); 
     myList.add("bar"); 
    } 
    public static void removeData(){ 
     if(myList.size() > 0){ 
      myList.remove(0); 
     } 
    } 
    public static void displayData(){ 
     for (String data : myList) { 
      System.out.println("data : "+data); 
     } 
    } 

    public static void main(String[] args) { 
     addData(); 
     displayData(); 
     removeData(); 
     displayData(); 
    } 
} 
+0

Это то, что вы делаете myList частным, а все аксессоры - в вашем классе. В противном случае вам нужно найти адреса памяти myList во время выполнения и установить аппаратные точки останова, как это делает отладчик. –

+0

Допустим, что это частная собственность, и все аксессоры находятся в одном классе, а не могли бы вы помочь мне с образцом кода для перехвата? – ashishakp

ответ

1

Вы можете сплести код Before/After/Around любой доступ к вашей области, используя следующие:

срезов в
@Aspect 
public class TestAccessorsAspect { 
    @Pointcut("get(java.util.List com.sample.Test.myList)") 
    public void readMyList(){} 

    @Pointcut("set(java.util.List com.sample.Test.myList)") 
    public void writeMyList(){} 
} 

в .aj синтаксиса, это может выглядеть следующим образом:

public aspect TestAccessorsAspect { 

    pointcut readMyList() : get(java.util.List com.sample.Test.myList); 

    pointcut writeMyList() : set(java.util.List com.sample.Test.myList); 
} 

Всякий раз, когда это поле доступно для чтения (например, для записи), эти pointcut вызывают срабатывание.

+0

Для решения этой проблемы вам не нужно добавлять сложность Aspect Oriented Programming. Аспекты действительно предназначены для пересечения нескольких классов. ОП имеет один класс. –

+1

Ну как вопрос был отмечен как 'aop', так и' aspectj', я предположил, что автор хотел получить ответ, используя аспекты. – XGouchet

+0

Да, мне нужно использовать концепцию АОП, это требование. Я просто дал пример кода, похожего на фактический код. Кстати, спасибо вам, ребята, за ответ. – ashishakp

0

Ваш вопрос достаточно прост, что я не знаю, понимаю ли я его. Из того, что вы сказали, на него отвечает очень небольшая корректировка.

public class Test { 
    private static List<String> myList = new ArrayList(); 

    public static void addData() { 
     myListAccessLogic(); 
     myList.add("foo"); 

     myListAccessLogic(); 
     myList.add("bar"); 
    } 
    public static void removeData() { 
     myListAccessLogic(); 
     if(myList.size() > 0) { 

      myListAccessLogic(); 
      myList.remove(0); 
     } 
    } 
    public static void displayData() { 
     myListAccessLogic(); 
     for (String data : myList) { 

      myListAccessLogic(); 
      System.out.println("data : "+data); 
     } 
    } 

    public static void main(String[] args) { 
     addData(); 
     displayData(); 
     removeData(); 
     displayData(); 
    } 
} 
+0

Хорошо, позвольте мне объяснить вам точный сценарий. У меня есть ситуация, когда JAR уже доступен, который содержит класс (SessionManager), имеющий статическое свойство (ArrayList «Пользовательский класс») для хранения зарегистрированных данных пользователя, теперь, когда новый пользователь добавляется в список, Я должен перехватить и добавить дополнительную информацию в этот объект, прежде чем добавлять его в список. Аналогично, при доступе к этому объекту я буду получать уже сохраненную (дополнительную) информацию и выполнять определенные операции. PS: JAR не содержит файлы источника (.java), но файлы .class, и мне не разрешено изменять что-либо в этом JAR. – ashishakp

+0

Хорошо, это имеет большое значение, потому что ArrayList является общедоступным, и внутри JAR-кода есть код, который может получить доступ к ArrayList через пути, о которых вы еще не знаете. Первое, что нужно заметить, это то, что, если они не зашифровали их исходный код, вы можете использовать один из декомпиляторов JAR-> java, который в основном позволит вам понять, что они сделали, и покажет вам, куда обращается ArrayList. Я использую jd-gui на Mac: http://jd.benow.ca, но поскольку это Java, вы можете запускать его в любом месте. Сделайте это и сообщите нам, как обращаться к ArrayList, который вы не контролируете. –

+0

Да @ Даниэль, я сделал то же самое и узнал о классе SessionManager и классе User. И вот использование этого списка - после того, как пользователь успешно зарегистрировался в приложении, он хранит данные пользователя, такие как userId, userName, sessionId и т. Д. В этом списке, и если один и тот же пользователь пытается войти в систему из другого браузера/системы, сохраняя предыдущий сеанс, они блокируют его, давая сообщение. – ashishakp