2015-02-22 2 views
0

Сегодня я начал работать с JCodeModel. Я хочу добавить в свой JDefinedClass атрибуты с другими типами, кроме int, String, boolean и т. Д. Окончательный Java код построен JCodeModel должен выглядеть следующим образом:JCodeModel: Атрибуты и списки со специальными типами классов

public Class Team { 
    private int teamID; 
    private String teamName; 
    private Coach coach; 
} 

Как я могу добавить Полевой тренер с типом класса «Coach» с JCodeModel?

jClass.field(JMod.PRIVATE, *???*, coach); 

Второй вопрос: Как добавить, например,

ArrayList<Coach> coachList; 

к моему списку атрибутов? Спасибо

ответ

1

Вы можете просто сгенерировать класс Coach и передать его как параметр методу field(...). Обратите внимание, что этот метод принимает JType как второй параметр, а JClass, а также JDefinedClass оба наследуются от JType.

Для ArrayList вы можете определить параметр типа, вызвав narrow по определенному классу, передав другой JType. (Это даже работает для параметров типа, то есть вы можете даже позвонить c.narrow(cm.ref("T")), чтобы дать ему параметр типа T).

Вот пример:

import java.io.File; 
import java.util.ArrayList; 

import com.sun.codemodel.JClass; 
import com.sun.codemodel.JCodeModel; 
import com.sun.codemodel.JDefinedClass; 
import com.sun.codemodel.JMod; 


public class CodeModelTest 
{ 
    public static void main(String[] args) throws Exception 
    { 
     JCodeModel codeModel = new JCodeModel(); 


     JDefinedClass teamClass = codeModel._class("Team"); 
     JDefinedClass coachClass = codeModel._class("Coach"); 
     teamClass.field(JMod.PRIVATE, coachClass, "coach"); 

     JClass arrayListClass = codeModel.ref(ArrayList.class); 
     JClass arrayListOfCoachClass = arrayListClass.narrow(coachClass); 
     teamClass.field(JMod.PRIVATE, arrayListOfCoachClass, "coaches"); 

     codeModel.build(new File(".")); 
    } 

} 

Он генерирует (пустой) класс Coach и класс Team как

import java.util.ArrayList; 

public class Team { 

    private Coach coach; 
    private ArrayList<Coach> coaches; 

} 

(я надеюсь, что этот ответ достаточно И хотя ссылки могли бы. умереть в будущем: я нашел эти учебники очень полезными, чтобы получить первое сжатие в CodeModel Редактировать: Обновленные ссылки см. ниже: CodeModel Basics, CodeModel Inheritance)


EDIT: Действительно, умер ссылки. Их следует рассматривать только как «дополнительные» или как указатель для дальнейшего чтения. Основная информация (в отношении исходного вопроса) должна содержаться в этом ответе. У меня нет рекомендации для других учебных пособий (за исключением того, что все могут найти с помощью базовых веб-страниц), но на данный момент я заменил ссылки своими последними моментальными снимками из веб-архива.

+0

Ссылки больше не работают. Любая замена, которую вы предлагаете? – iCrus

+0

@iCrus У меня пока нет конкретного предложения, см. ** EDIT **, но обновили ссылки со своим последним снимком из веб-архива. Когда я нахожу хороший учебник для JCodeModel, я могу обновить ссылки снова, но в любом случае фрагменты кода, которые я опубликовал, должны все еще достаточно отвечать на исходный вопрос. – Marco13