2016-09-19 3 views
1

Ich benutze Codemodel-Bibliothek für die Java-Klasse-Generation. Gibt es eine Möglichkeit, einen generischen Methodenaufruf zu erzeugen, die wie folgt aussieht:Sun Codemodel generische Methodenaufruf

clazz.<String>get(value) 

Es ist sicherlich ein Weg, nur ein Rückergebnisses auf eine korrekte Art mit dem folgenden Ausdruck Gießen:

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

der Ergebnisse in

aber die bevorzugte Art des Castings ist die erste, wie dieser Code Vorlagen für weitere manuelle Bearbeitung durch Entwickler generiert.

Antwort

1

Mit der vorhandenen JCodeModel API gibt es keine vorgefertigte Möglichkeit, dies zu handhaben. Sie können jedoch definieren Sie Ihre eigene JStatement Art die allgemeine Erklärung wie folgt zu generieren:

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

Welche erzeugt:

package org.test; 

public class Tester { 

    public void test() { 
     Class clazz = getClass(); 
     clazz.<String >get(); 
    } 
} 

Dies ist keineswegs eine vollständige Lösung bedeutet (es ist Call-Methode fehlt Argumente für Beispiel). Werfen Sie einen Blick auf die Implementierung der generate() Methode in JInvocation für die Details, die erforderlich sind.

+0

Das ist genau das, was ich brauche. Danke, John! –