Вы можете довольно просто использовать синтаксис mixin AspectJ для эмуляции множественного наследования (и во время компиляции тоже). Сначала объявите интерфейс для функций, которые вы хотите смешать:
public interface A{
String getSomethingForA();
}
затем определите аннотацию, которую вы можете использовать, чтобы указать, что вы хотите, чтобы миксин применялся к данному классу:
public @interface WithA {}
затем добавьте аннотацию к классу, который вы хотите использовать:
@WithA
public class MyClass {}
затем, чтобы добавить некоторые функции:
@Aspect
public class MixinA {
public static class AImpl implements A{
public String getSomethingForA() {
return "it worked!";
}
}
@DeclareMixin("@WithA *")
public static A get() {
return new AImpl();
}
}
Вам нужно будет использовать jar aspectj и запускать аспекты как часть процесса компиляции, но это позволит вам создать действительно модульную функциональность и затем принудительно объединить ее с вашими классами. Чтобы получить доступ к вашему классу с новой функциональностью, выполните следующие действия:
MyClass obj = new MyClass();
((A)obj).getSomethingForA();
Вы можете применить ту же аннотацию к другому классу, а также разыграть ее:
@WithA
@WithB //let's pretend we created this with some other functionality
public class AnotherClass {}
AnotherClass anotherObj = new AnotherClass();
((A)anotherObj).getSomethingForA();
((B)anotherObj).andSetSomethingElseForB("something else");