2014-10-12 2 views
1

Моя цель - «обойти» все методы equals подклассов типа. Итак, я написал следующий аспект.AspectJ непревзойденный тип предупреждения: как интерпретировать?

Я использую плагин aspectj-maven, и я говорю ему, чтобы сплести код в файле jar зависимости, так как это все методы equals.

Я вознагражден:

Warning:(22, 0) ajc: does not match because declaring type is java.lang.Object, if match desired use target(com.basistech.rosette.dm.BaseAttribute+) [Xlint:unmatchedSuperTypeInCall] 
Warning:(22, 0) ajc: advice defined in com.basistech.rosette.dm.AdmEquals has not been applied [Xlint:adviceDidNotMatch] 

Я озадачен. Множество типов в иерархии BaseAttribute объявляет equals, поэтому не следует смотреть Object. Добавление &&target(BaseAttribute+), похоже, не устраняет эту ошибку.

Что мне не хватает, и/или как я могу отслеживать это?

package com.basistech.rosette.dm; 

/** 
* See if we can't make an aspect to spy on equals ... 
*/ 
public aspect AdmEquals { 
    // we would like to narrow this to subclasses ... 
    boolean around(Object other): call(public boolean BaseAttribute+.equals(java.lang.Object)) && args(other) { 
     boolean result = proceed(other); 
     if (!result) { 
      System.out.println(this); 
      System.out.println(other); 
      System.out.println(result); 
     } 
     return true; 
    } 
} 

ответ

2

ОК, свет рассвет. Спецификации вызова AspectJ описывают, где метод определен в основе иерархии классов, по-видимому, не там, где он переопределен. Таким образом, следующая цель - сделать необходимую грязную работу.

public aspect AdmEquals { 
    // we would like to narrow this to subclasses ... 
    boolean around(Object other) : 
     call(public boolean Object.equals(java.lang.Object)) && 
     args(other) && 
     target(BaseAttribute+) 
    { 
     boolean result = proceed(other); 
     if (!result) { 
      System.out.println(this); 
      System.out.println(other); 
      System.out.println(result); 
     } 
     return true; 
    } 
} 
+0

Нет, это не решение. Я напишу еще один ответ и объясню, почему и что делать. – kriegaex

+0

К сожалению, я плохо, я не прокрутил по горизонтали, чтобы увидеть «target()' часть pointcut. Я только что переформатировал код с разрывами строк, чтобы сделать важную часть видимой. – kriegaex

+0

В качестве альтернативы вам может потребоваться использовать выполнение вместо вызова pointcut. Он также сплет меньше места в коде, который часто бывает благоприятным: 'execute (public boolean BaseAttribute + .equals (Object))' Таким образом, вам также не нужно ограничение 'target()'. – kriegaex

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