Как динамически генерировать код с помощью javapoet? Изменить параметры метода

Я пытаюсь создать код Java, который зависит от других переменных. В этот конкретный момент я пытаюсь сгенерировать код в зависимости от протокола. Таким образом, я могу получить объект CoapResponse или форму объекта Response (javax).

Я не знаю, возможно ли вместо повторения всего кода два раза с другим параметром, если я могу повторно использовать один и тот же код и каким-то образом изменить только переменную.

Код, который я хочу изменить, следующий:


  MethodSpec payloadInterpreter = MethodSpec.methodBuilder("payloadInterpreter")
          .addModifiers(Modifier.PRIVATE)
          .addModifiers(Modifier.STATIC)
         .addParameter(Response.class, "getResponse")
          ....

И Параметр это может быть CoapResponse.class вместо Response.class.

У меня была та же проблема с утверждениями, но я решил создать литералы, которые используют информацию, полученную службой во время выполнения. Пример:

if (MD.getMediatype().equals("JSON")){
      ReadOutDeclaration="JSONObject readout= null";
      GetReadOut="readout = getResponse.readEntity(JSONObject.class)";

а потом:

 MethodSpec payloadInterpreter = MethodSpec.methodBuilder("payloadInterpreter")
     .addModifiers(Modifier.PRIVATE)
     .addModifiers(Modifier.STATIC)
     .addParameter(Response.class, "getResponse")
     .addStatement("$L",ReadOutDeclaration)
     .beginControlFlow("try")
     .addStatement("$L", GetReadOut)
     .addStatement("System.out.println(\"Provider Response payload: \" + $L)",ReadOutPrint)   

Я не знаю, могу ли я сделать что-то подобное с параметрами или даже есть ли другие способы динамического изменения поколения. Заранее спасибо.


person Cristina Paniagua    schedule 15.08.2019    source источник


Ответы (1)


Может это поможет:

MethodSpec.Builder payloadInterpreterMethod = MethodSpec.methodBuilder("payloadInterpreter")
          .addModifiers(Modifier.PRIVATE)
          .addModifiers(Modifier.STATIC);
if (condition) {
  payloadInterpreterMethod.addParameter(Response.class, "getResponse");
} else {
  payloadInterpreterMethod.addParameter(CoapResponse.class, "getResponse");
}

и как только вы захотите добавить его в TypeSpec, используйте:

payloadInterpreterMethod.build()
person El Hoss    schedule 16.08.2019
comment
Благодарю вас! Я не знал, что могу сломать конструктор. Это решает мой вопрос и сэкономит мне много времени и строк кода! - person Cristina Paniagua; 16.08.2019