Java Sun Codemodel通用方法调用

Java Sun Codemodel通用方法调用,java,generics,method-invocation,sun-codemodel,Java,Generics,Method Invocation,Sun Codemodel,我正在使用Codemodel库生成java类。有没有一种方法可以生成如下所示的通用方法调用: clazz.<String>get(value) JDefinedClass definedClass = codeModel._class(JMod.PUBLIC, "org.test.Tester", ClassType.CLASS); JMethod method = definedClass.method(JMod.PUBLIC, codeModel.VOID,

我正在使用Codemodel库生成java类。有没有一种方法可以生成如下所示的通用方法调用:

clazz.<String>get(value)
    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();
        }
    });
导致

(String) clazz.get(value)

但首选的强制转换方法是第一种,因为此代码生成模板供开发人员进一步手动编辑。

对于现有的JCodeModel API,没有预构建的方法来处理此问题。但是,您可以定义自己的
JStatement
类型来生成如下通用声明:

clazz.<String>get(value)
    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();
        }
    });
JDefinedClass definedClass=codeModel.\u class(JMod.PUBLIC,“org.test.Tester”,ClassType.class);
JMethod method=definedClass.method(JMod.PUBLIC,codeModel.VOID,“test”);
最终JType targetType=codeModel.ref(String.class);
final JVar clazzVar=method.body().decl(codeModel.ref(Class.Class),“clazz”,JExpr.invoke(“getClass”);
方法.body().add(新的JStatement()){
@凌驾
公共无效状态(JF格式化程序){
f、 g(clazzVar.p(“.”.p(“get”).p(“()”).nl();
}
});
由此产生:

package org.test;

public class Tester {

    public void test() {
        Class clazz = getClass();
        clazz.<String >get();
    }
}
package-org.test;
公共类测试员{
公开无效测试(){
Class clazz=getClass();
clazz.get();
}
}

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

这正是我需要的。谢谢你,约翰!