JExpression
基本的にはリストをサポートしていないと思います。はありJArray
ますが、それでも を反復処理する必要がありますheadersList
。codemode-2.6 までは、JExpr
またはJExpression
リストを反復処理するメソッドはありません。したがって、反復部分を回避することはできません。headersList
したがって、標準的な方法は、初期化ステートメントを繰り返して追加することです。
たとえば、次のような Namevalue ペアがあるとします。
public class BasicNameValuePair {
private String name;
private String value;
public BasicNameValuePair(String name, String value) {
this.name = name;
this.value = value;
}
//getters & setters
}
のように初期化されます
List<BasicNameValuePair> headerList = new ArrayList<BasicNameValuePair>();
headerList.add(new BasicNameValuePair("1", "1"));
headerList.add(new BasicNameValuePair("2", "2"));
headerList.add(new BasicNameValuePair("3", "3"));
headerList.add(new BasicNameValuePair("4", "4"));
次に、メソッド本体を次のように生成できます
private JMethod makeHeadersWrapper( String endPointName, List<BasicNameValuePair> headersList ) {
JClass headerClass = codeModel.ref( headersList.getClass() ).narrow( BasicNameValuePair.class );
JMethod wrapperMethod = definedClass.method( JMod.PUBLIC | JMod.STATIC, headerClass, ( "make" + endPointName + "Header") );
JVar headersListVar = wrapperMethod.body().decl( wrapperMethod.type(), "headersList", JExpr._new(headerClass) );
for(BasicNameValuePair nameValuePair : headersList) {
wrapperMethod.body().add(headersListVar.invoke("add").arg(JExpr._new(nameValuePairClass).arg(nameValuePair.getName()).arg(nameValuePair.getValue())));
}
wrapperMethod.body()._return( headersListVar );
return wrapperMethod;
}
これにより、コードが生成されます
public static ArrayList<BasicNameValuePair> makeTestHeader() {
ArrayList<BasicNameValuePair> headersList = new ArrayList<BasicNameValuePair>();
headersList.add(new BasicNameValuePair("1", "1"));
headersList.add(new BasicNameValuePair("2", "2"));
headersList.add(new BasicNameValuePair("3", "3"));
headersList.add(new BasicNameValuePair("4", "4"));
return headersList;
}
ただしArrayList
、を使用するコンストラクター メソッドがあり{{ }}
ます。したがって、次のように宣言できます
List<String> lst = new ArrayList<String>(){{ add("1"); add("2"); add("3"); add("4"); }};
そして、ソースコードを直接渡す方法がありますJExpr
。direct()
これらの両方を使用して、以下のようなコードを生成できます。このアプローチはお勧めしませんが、可能です。
private JMethod makeHeadersWrapper( String endPointName, List<BasicNameValuePair> headersList ) {
JMethod wrapperMethod = definedClass.method( JMod.PUBLIC | JMod.STATIC, codeModel.ref( headersList.getClass() ).narrow( BasicNameValuePair.class ), ( "make" + endPointName + "Header") );
JVar headersListVar = wrapperMethod.body().decl( wrapperMethod.type(), "headersList", JExpr.direct(generateListConstructor(headersList)) );
wrapperMethod.body()._return( headersListVar );
return wrapperMethod;
}
private String generateListConstructor(List<BasicNameValuePair> headersList) {
StringBuilder listEpr = new StringBuilder("new ArrayList<scope.BasicNameValuePair>(){{");
for(BasicNameValuePair nameValuePair : headersList) {
listEpr.append("add(new BasicNameValuePair(\"").append(nameValuePair.getName()).append("\", \"").append(nameValuePair.getValue()).append("\")); ");
}
return listEpr.append("}}").toString();
}
これにより生成されます
public static ArrayList<BasicNameValuePair> makeTestHeader() {
ArrayList<BasicNameValuePair> headersList = (new ArrayList<scope.BasicNameValuePair>(){{add(new BasicNameValuePair("1", "1")); add(new BasicNameValuePair("2", "2")); add(new BasicNameValuePair("3", "3")); add(new BasicNameValuePair("4", "4")); }});
return headersList;
}
これも有効な Java コードです。
この答えはあなたが探している正確なものではないかもしれませんが、前進するためのアイデアを与えるかもしれません. お役に立てれば。