Как использовать любое поле родительского класса с помощью codemodel - PullRequest
0 голосов
/ 05 июля 2018

У меня есть класс 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 ]

0 голосов
/ 05 июля 2018

Вы можете ссылаться на поле напрямую, используя 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();

}
0 голосов
/ 05 июля 2018

Вы можете присвоить классу 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";
    }
}
...