2016-09-19 63 views
1

我正在使用Codemodel库进行java类生成。有没有一种方法来生成一个通用的方法调用看起来像这样:Sun Codemodel通用方法调用

clazz.<String>get(value) 

有一定的只是使用下面的表达式铸造返回结果的正确类型的方式:

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

这结果在

(String) clazz.get(value) 

但铸件的优选方式是第一位的,因为这代码是由开发者生成用于进一步的手动编辑的模板。

回答

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(); 
    } 
} 

这绝不意味着一个完整的解决方案(它缺少方法调用的参数为实例)。请参阅JInvocation中的generate()方法的实现以了解所需的详细信息。

+0

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