Я работаю над модулем Java, который использует Groovy в качестве зависимости от времени компиляции, и я хотел бы добавить метод в свой класс Java Person
(например, Groovy JDK) без написания кода Groovy.
В Groovy я бы добился этого вот так
Person.meta.doSomething = { String param -> println "do something: ${param}" }
Как я могу это сделать, используя Groovy API на Java?
ИЗМЕНИТЬ 1:
До сих пор я реализовал следующее, и я почти готов. Я создаю экземпляр класса Expando для Person
и регистрирую MethodClosure
, который делегирует вызов метода методу в классе PersonDefaultMethods
.
ExpandoMetaClass expando = new ExpandoMetaClass (Person.class, true, false);
expando.registerInstanceMethod ("format", new MethodClosure (new PersonDefaultMethods(), "format"));
expando.initialize ();
PersonDefaultMethods
содержит реализацию методов, которые я объявил в классе Expando.
public class PersonDefaultMethods {
public String format(String format) {
return this.toString(); // this one gets called
}
public String format(Person self, String format) { // but I want this method to be called
return self.getFirstname() + " " + self.getLastname();
}
}
Когда я знаю, что выполнить сценарий Groovy в этом контексте, я могу вызвать метод format
в экземпляре Person
, но не могу получить доступ к delegate
, как обычно, используя закрытие.
ИЗМЕНИТЬ 2:
Подход с использованием подкласса закрытия или анонимного класса закрытия не работает в моей реализации.
ExpandoMetaClass expando = new ExpandoMetaClass(Person.class, true, false);
expando.registerInstanceMethod("format", new Closure(this) {
@Override
public Object call(Object arguments) {
return super.call(arguments);
}
@Override
public Class[] getParameterTypes () {
return new Class[] { String.class};
}
});
expando.initialize ();
Это делает свою работу. Спасибо.