2014-09-23 2 views
0

Я пытаюсь использовать @DeclareMixin в первый раз, и либо я делаю что-то неправильное, либо где-то есть ошибка.@DeclareMixin добавленные методы, не видимые другими классами

Я опубликовал свой пример кода для github: https://github.com/benze/AspectJError.git. Я тоже вставляю здесь маленькие кусочки.

Если я посмотрю на скомпилированный код ApplyAspect.class с помощью декомпилятора, я вижу, что ajc правильно добавлен в реализованный интерфейс. Однако компилятор жалуется на Тест, что у ApplAspect нет методов setCreated() или getCreated().

Кроме того, если я попытаюсь скомпилировать проект из командной строки, то получаю те же ошибки компиляции.

Я не уверен, что я делаю неправильно, или если в другом месте есть ошибка с директивой @DeclareMixin.

Интерфейс CreatedBean.java: CreatedBeanImpl.java

public interface CreatedBean { 
    public Object getCreated(); 
    public void setCreated(final Object created); 
} 

Реализация: определение

public class CreatedBeanImpl implements CreatedBean{ 
     private Object created; 

     public Object getCreated(){ 
      return this.created; 
     } 

     public void setCreated(final Object created){ 
      this.created = created; 
     } 
} 

Формат:

@Aspect 
public class DeclareMixinAspect { 
    @DeclareMixin("com.benze.bo.ApplyAspect") 
    public CreatedBean auditableBeanMixin(){ 
     return new CreatedBeanImpl(); 
    } 
} 

Класс советуют (com.benze.bo упак):

public class ApplyAspect { 
    private String name = "test class"; 
} 

класса пытаются использовать ApplyAspect:

public class Test { 

    public static void main(String[] args) { 
     ApplyAspect aa = new ApplyAspect(); 
     aa.setCreated(new Date()); 
     System.out.println(aa.getCreated().toString()); 
     System.out.println(aa.toString()); 
     System.out.println("all done"); 
    } 
} 

ПОМ является очень простой только плагин AspectJ (и зависимостей) добавил. Я использую AJ 1.8.2.

ответ

1

Я думаю, что вам нужно проливает в классе Test:

((CreatedBean)aa).setCreated(new Date()); 

System.out.println(((CreatedBean)aa).getCreated().toString()); 

IIRC причина заключается в том, что код аннотацию стиль предназначен для компилируется с JAVAC, который не знал бы о аффект DeclareMixin.

+0

Ugg - требуется литье каждый раз уродливо. Я знаю в синтаксисе AJ, я могу объявить реализацию как часть интерфейса (внутренний статический аспект), а затем просто применить интерфейс с простым 'declare parents: xxx реализует yyy'. Тогда мне не нужно использовать 'aa' bean. Есть ли способ объединить эти два? Т.е.: использовать синтаксис AJ для добавления реализации интерфейса (вместо стиля аннотации), но сохранить реализацию и интерфейс отдельно (каждый в своем собственном .java-файле)? –

+0

Кастинг решает проблему, но, как я уже сказал, я бы предпочел не иметь случая, если это возможно. IIRC, используя нотацию AJ, не требует, чтобы я произносил; есть ли эквивалент в стиле аннотаций? –

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