Как назначить метод с несколькими аргументами в Java CodeModel API
Я хочу сгенерировать код, как показано ниже в примере с Java CodeModel API
package com.testcase.myPackage;
package com.aaa.abc;
package com.bbb.b;
import org.testng.annotations.Test;
public class TestCode {
private int a;
private int b;
@Test public void testMethod() throws excep1,excep2,excep3 {
a=abc.method1(b.param1,param2,param3);
}
}
Я уже объявил переменную класса a
& b
, метод testMethod с аннотацией @Test. Теперь я застрял в следующем пункте:
Невозможно выдать несколько исключений (throws excep1, excep2, excep3) в методе.
Невозможно вызвать метод с несколькими параметрами и назначить этот вызов в переменной класса
a = abc.method1(b.param1, param2, param3)
Как мне решить эти проблемы?
1 ответ
Чтобы объявить несколько исключений метода и несколько параметров вызова метода, API JCodeModel позволяет вам связать вызов, чтобы добавить исключения и параметры:
Исключения:
testMethod._throws(Exception1.class)._throws(Exception2.class)._throws(Exception3.class);
Параметры метода:
body.assign(a, abcRef.staticInvoke("method1").arg(param1Var).arg(param2Var).arg(param3Var));
Для полноты вот код для генерации класса, близкого к вашему примеру:
JDefinedClass testCodeClass = codeModel._class(JMod.PUBLIC, "com.testcase.myPackage.TestCode", ClassType.CLASS);
JFieldVar a = testCodeClass.field(JMod.PRIVATE, codeModel.INT, "a");
JFieldVar b = testCodeClass.field(JMod.PRIVATE, codeModel.INT, "b");
JMethod testMethod = testCodeClass.method(JMod.PUBLIC, codeModel.VOID, "testMethod");
testMethod.annotate(Test.class);
testMethod._throws(Exception1.class)._throws(Exception2.class)._throws(Exception3.class);
JBlock body = testMethod.body();
JClass abcRef = codeModel.ref(abc.class);
JVar param1Var = body.decl(codeModel.INT, "param1", JExpr.lit(1));
JVar param2Var = body.decl(codeModel.INT, "param2", JExpr.lit(2));
JVar param3Var = body.decl(codeModel.INT, "param3", JExpr.lit(3));
body.assign(a, abcRef.staticInvoke("method1").arg(param1Var).arg(param2Var).arg(param3Var));
Который генерирует:
package com.testcase.myPackage;
import com.xxx.yyy.abc;
import org.junit.Test;
public class TestCode {
private int a;
private int b;
@Test
public void testMethod()
throws Exception1, Exception2, Exception3
{
int param1 = 1;
int param2 = 2;
int param3 = 3;
a = abc.method1(param1, param2, param3);
}
}