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