Как использовать любое поле родительского класса, используя codemodel
У меня есть класс Parent
и класс Derived
лайк
class Parent {
SomeClass obj = new SomeClass();
}
Теперь под классом я хочу создать с использованием CodeModel
class Derived extends Parent {
String s = obj.invoke();
}
Я пробовал ниже, но не работает
tryBlock.body().decl(codeModel.ref(String.class), "s",
(codeModel.ref(Parent.class)).staticRef("obj").invoke("invoke"));
Как я могу вызвать obj, а не создавать новый объект, как я делаю в Parent
учебный класс?
2 ответа
Вы можете ссылаться на поле напрямую, используя JExpr.ref()
и использовать его для инициализации поля:
JDefinedClass derived = codeModel._class(JMod.PUBLIC, "Derived", ClassType.CLASS);
derived._extends(Parent.class);
derived.field(0, String.class, "s", JExpr.ref("obj").invoke("invoke"));
Это создает следующее:
public class Derived
extends Parent
{
String s = obj.invoke();
}
Вы могли бы дать Parent
класс protected
атрибут типа SomeClass
и использовать его непосредственно в Derived
учебный класс:
public class Parent {
protected SomeClass someObject;
public Parent() {
this.someObject = new SomeClass();
}
}
public class Derived extends Parent {
public void printInvoked() {
System.out.println(this.someObject.invoke());
}
}
public class SomeClass {
public String invoke() {
return "SomeClass invoked";
}
}