2016-09-19 5 views
1

Я использую библиотеку Codemodel для генерации Java-класса. Есть ли способ, чтобы создать общий вызов метода, который выглядит следующим образом:Всесторонний вызов вызова Sun Codemodel

clazz.<String>get(value) 

Существует, конечно, способ просто бросает обратный результат правильного типа, используя следующее выражение:

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

который результаты в

(String) clazz.get(value) 

но предпочтительный способ литья является первым, так как этот код генерирует шаблоны для дальнейшего ручного редактирования разработчиками.

ответ

1

С существующим API JCodeModel нет готового способа справиться с этим. Вы можете, однако, определить свой собственный 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 для получения подробной информации.

+0

Это именно то, что мне нужно. Спасибо, Джон! –