Я хочу использовать аннотацию @Mixin в Groovy, которая делает именно то, что я хочу, за исключением того, что она также смешивает частные методы и поля.
class A {
def private fooA() {
println("A")
}
}
@Mixin(A)
class B {
def fooB() {
println("B")
}
}
Если я сейчас запущу этот код
static main(args)
{
def b = new B()
println(b.fooA())
B.metaClass.fooA = {throw new MissingMethodException()};
println(b.fooA())
}
Сначала он вызывает закрытый метод A.fooA и печатает «A». Затем этот частный метод удаляется и не может быть вызван клиентским классом B из смешанного класса A. Я хотел бы, чтобы все было так с самого начала.
Теперь мой вопрос заключается в том, как я могу добиться этого в общем виде? Я могу расширить аннотацию @Mixin. Проблема в том, что я новичок в Groovy, и на самом деле не так много информации о том, как писать преобразования AST. Новая книга Groovy в действии, в которой о нем есть целая глава, еще не вышла.
Вместо этого я могу использовать @Delegate, но тогда мне нужно объявить переменную для делегированного класса. Это не то, чего я хочу. Я бы предпочел, чтобы я мог просто сказать разработчику, использующему мои материалы, просто аннотировать его класс с помощью @Mixin, чтобы смешать мои материалы, и все. И я могу быть уверен, что частные методы и поля моего класса не могут быть вызваны пользователем, нарушающим внутренний код смешанного класса.
Есть ли у кого-нибудь намек, в каком направлении я должен попытаться сделать это? Спасибо, Оливер.