2015-10-09 3 views
0

Я использую классы кода солнца (2.4.1) для генерации кода. Как передать класс в JInvocation.arg? Код, который я пытаюсь создать это:Sun CodeModel с использованием класса с JInvocation.arg

JAXBContext jc; 
jc = JAXBContext.newInstance(NaturalLanguageUsage.class); 

код Я бегу это:

JClass importJAXBContext = codeModel.directClass(javax.xml.bind.JAXBContext.class.toString()); 
JType typeJAXBContext = codeModel._ref(javax.xml.bind.JAXBContext.class); 
JVar varJc = block.decl(typeJAXBContext, "jc"); 

JInvocation invokeJAXBContext = block.staticInvoke(importJAXBContext, "newInstance"); 
invokeJAXBContext.arg(??); // how do I pass NaturalLanguageUsage.class 

То, что я хотел бы произвести:

JAXBContext jc; 
jc = JAXBContext.newInstance(NaturalLanguageUsage.class); 

или даже лучше:

JAXBContext jc = JAXBContext.newInstance(NaturalLanguageUsage.class); 

ответ

2
JClass importJAXBContext = codeModel.ref(javax.xml.bind.JAXBContext.class); 
    JVar varJc = block.decl(importJAXBContext, "jc"); 

    JClass naturalLangClassRef = codeModel.ref(NaturalLanguageUsage.class); 

    JInvocation invokeJAXBContext = importJAXBContext.staticInvoke("newInstance"); 
    invokeJAXBContext.arg(naturalLangClassRef.dotclass()); 

    block.assign(varJc, invokeJAXBContext); 

Для получения заявления и назначения в одной строке:

JVar varJc = block.decl(importJAXBContext, "jc", invokeJAXBContext); 
+0

Я получаю 1 ошибку, когда я использую это точно так, как представлено. Первая строка codeModel.ref хочет, чтобы String не был классом, поэтому у меня есть toString(), как в моем Вопросе. Я принимаю ваш ответ, хотя бы вы знали, как я могу сделать объявление и назначение на одной линии против двух? – EGHM

+2

Это странно, потому что вы должны использовать метод ref, который принимает класс arg - см. [This] (https://codemodel.java.net/nonav/apidocs/com/sun/codemodel/JCodeModel.html#ref% 28java.lang.Class% 29). Какую версию codemodel вы используете? В классе JBlock существует перегруженный метод 'decl', который принимает JExpression в качестве третьего аргумента, что позволяет выполнять декларирование и инициализацию в одной строке. – ddms

+0

Использование версии 2.4.1 sun.codemodel. В предыдущем комментарии я сказал, toString(), но getName() лучше, поскольку он удерживает класс или интерфейс от импорта. Я думаю, что есть проблема с этим URL. – EGHM

Смежные вопросы