Sun Codemodel 泛型方法调用
Sun Codemodel generic method invocation
我正在使用 Codemodel 库生成 java-class。有没有一种方法可以生成如下所示的通用方法调用:
clazz.<String>get(value)
肯定有一种方法可以使用以下表达式将 return 结果转换为正确的类型:
JExpr.cast(stringType, clazz.invoke("get").arg(value))
这导致
(String) clazz.get(value)
但首选的转换方式是第一种,因为此代码生成模板供开发人员进一步手动编辑。
使用现有的 JCodeModel API,没有预构建的方法来处理这个问题。但是,您可以定义自己的 JStatement
类型来生成这样的通用声明:
JDefinedClass definedClass = codeModel._class(JMod.PUBLIC, "org.test.Tester", ClassType.CLASS);
JMethod method = definedClass.method(JMod.PUBLIC, codeModel.VOID, "test");
final JType targetType = codeModel.ref(String.class);
final JVar clazzVar = method.body().decl(codeModel.ref(Class.class), "clazz", JExpr.invoke("getClass"));
method.body().add(new JStatement(){
@Override
public void state(JFormatter f) {
f.g(clazzVar).p(".<").g(targetType).p(">").p("get").p("();").nl();
}
});
生成:
package org.test;
public class Tester {
public void test() {
Class clazz = getClass();
clazz.<String >get();
}
}
这绝不是一个完整的解决方案(例如,它缺少方法调用参数)。查看 JInvocation
中 generate()
方法的实现,了解所需的详细信息。
我正在使用 Codemodel 库生成 java-class。有没有一种方法可以生成如下所示的通用方法调用:
clazz.<String>get(value)
肯定有一种方法可以使用以下表达式将 return 结果转换为正确的类型:
JExpr.cast(stringType, clazz.invoke("get").arg(value))
这导致
(String) clazz.get(value)
但首选的转换方式是第一种,因为此代码生成模板供开发人员进一步手动编辑。
使用现有的 JCodeModel API,没有预构建的方法来处理这个问题。但是,您可以定义自己的 JStatement
类型来生成这样的通用声明:
JDefinedClass definedClass = codeModel._class(JMod.PUBLIC, "org.test.Tester", ClassType.CLASS);
JMethod method = definedClass.method(JMod.PUBLIC, codeModel.VOID, "test");
final JType targetType = codeModel.ref(String.class);
final JVar clazzVar = method.body().decl(codeModel.ref(Class.class), "clazz", JExpr.invoke("getClass"));
method.body().add(new JStatement(){
@Override
public void state(JFormatter f) {
f.g(clazzVar).p(".<").g(targetType).p(">").p("get").p("();").nl();
}
});
生成:
package org.test;
public class Tester {
public void test() {
Class clazz = getClass();
clazz.<String >get();
}
}
这绝不是一个完整的解决方案(例如,它缺少方法调用参数)。查看 JInvocation
中 generate()
方法的实现,了解所需的详细信息。