Sun Codemodel泛型方法调用

时间:2016-09-19 07:53:17

标签: java generics method-invocation sun-codemodel

我正在使用Codemodel库进行java类生成。有没有办法生成如下所示的泛型方法调用:

1
0
0000000000000000000000000000000

当然有一种方法可以使用以下表达式将返回结果转换为正确的类型:

clazz.<String>get(value)

导致

JExpr.cast(stringType, clazz.invoke("get").arg(value))

但首选的投射方式是第一种,因为此代码生成的模板供开发人员进一步手动编辑。

1 个答案:

答案 0 :(得分:1)

使用现有的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();
    }
}

这绝不是一个完整的解决方案(例如,它缺少方法调用参数)。请查看generate()JInvocation方法的实现,了解所需的详细信息。