2010-06-02 15 views
15

¿Alguien sabe qué enfoque se puede tomar para generar automáticamente el código fuente de Java, por ejemplo un archivo xml o json, en eclipse?¿Genera código Java en Eclipse?

Un gran ejemplo de lo que estoy pensando hacer es lo que hace Google Android sdk: tienen una clase R generada automáticamente a partir del resources.

Cada vez que se guarda un archivo de recursos en Eclipse, la clase R se regenera automáticamente.

ACTUALIZACIÓN: Ejemplo: En el texto (archivo XML o JSON) Tengo el siguiente:

<tags> 
    <tag id="ALPHA"> 
     <description>The first alpha tag.</description> 
     <value>231232</value> 
    </tag> 
    <tag id="BETA"> 
     <description>This is the beta tag.</description> 
     <value>231232</value> 
    </tag> 

Luego, en mi clase Java generada, por ejemplo RI tendría algo como:

R.tags.ids.ALPHA //refers to an enum value for example 
R.tags.values.ALPHA //refers to final int with avlue 231232 
R.tags.descriptions.ALPHA //refers to the String with description 

¡Gracias!

+0

No olvide que en el caso de Android puede descargar el código fuente del SDK y de toda la plataforma y examinar cómo lo hacen (http://android.git.kernel.org) – JRL

+0

Gracias, pero es ¡ENORME, no sabría por dónde empezar! – drozzy

+0

¿Está solo haciendo objetos de datos (poco o ningún comportamiento)? Si es así, debería usar JAXB. Ver mi respuesta –

Respuesta

3

Estoy agregando otra respuesta basada en sus comentarios y también porque realmente no recomiendo hacerlo fuera del SDK de recursos de Android de Google. Google básicamente está utilizando una jerarquía de clases estáticas (singletons) para sus recursos. Necesita hacer que su XSLT genere variables de miembros estáticos en lugar de getters y setters.

Básicamente tomé mi respuesta anterior y la cambié a estática para todas las variables de miembro. Tienes que tener mucho cuidado al hacer esto porque he visto tantos errores con el uso incorrecto del modificador "estático".

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" /> 
    <xsl:template match="/" priority="100"> 
    public class <xsl:value-of select="name(node())" /> { 
     <xsl:apply-templates select="child::node()" /> 
    } 
    </xsl:template> 
    <xsl:template match="/*/*"> 
     public static String <xsl:value-of select="name()" />; 
     public static String get<xsl:value-of select="name()" /> { 
      return <xsl:value-of select=" name()" />; 
     } 

     public void static set<xsl:value-of select="name()" />(String value) { 
      <xsl:value-of select="name()" /> = value; 
     } 
    </xsl:template> 
</xsl:stylesheet> 

Si se procesa con este ejemplo XML:

<?xml version="1.0" encoding="UTF-8"?> 
<Human> 
    <EyeColor>brown</EyeColor> 
    <HairColor>brown</HairColor> 
</Human> 

Usted consigue algo como: clase pública Humano {

public static String EyeColor; 

    public static String getEyeColor { 
     return EyeColor; 
    } 

    public static void setEyeColor(String value) { 
     this.EyeColor = value; 
    } 


    public static String HairColor; 
    public static String getHairColor { 
     return HairColor; 
    } 

    public static void setHairColor(String value) { 
     this.HairColor = value; 
    } 


} 
+0

¿Por qué necesito los métodos getter setter si es público? ¿Por qué no miembros estáticos finales generales? – drozzy

+1

Porque los necesita si desea usar herramientas de serialización (como JAXB) que leen y completan automáticamente los campos. De lo contrario, no los necesita. De hecho, algunas herramientas le permiten usar variables miembro en lugar de getters/setters. –

+1

¿Hay alguna manera de conectar esto en eclipse para que se apague automáticamente, cada vez que guardo un archivo xml, por ejemplo? – drozzy

4

La forma en que lo hago es que tengo un archivo XSLT que simplemente transforma mis datos xml (en mi caso, una especificación de protocolo) en código fuente de Java. Esta transformación XSLT se puede realizar fácilmente en una tarea ANT que podría incluirse en la cadena de construcción en eclipse.

Quizás haya un complemento para esta tarea en particular.

Algunos enlaces útiles:

1

De XML a Java y viceversa recomiendo JAXB.

Puede generar código fuente de Java a partir de Schema usando JAXB 2.0 o posterior. O puede generar esquemas desde Java.

También puede hacer que JAXB genere/consuma JSON fácilmente usando Jettison.

También puede hacer que JAXB genere POJO's en un Martin Fowler Fluent Style o un montón de maneras diferentes usando su sistema de complementos.

EDITAR basado en sus comentarios: Tienes XSLT generar su POJO JAXB:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" /> 
    <xsl:template match="/" priority="100"> 
    import javax.xml.bind.annotation.XmlRootElement; 

    @XmlRootElement(name="Human") 
    public class <xsl:value-of select="name(node())" /> { 
     <xsl:apply-templates select="child::node()" /> 
    } 
    </xsl:template> 
    <xsl:template match="/*/*"> 
     private String <xsl:value-of select="name()" />; 
     public String get<xsl:value-of select="name()" /> { 
      return <xsl:value-of select=" name()" />; 
     } 

     public void set<xsl:value-of select="name()" />(String value) { 
      this.<xsl:value-of select="name()" /> = value; 
     } 
    </xsl:template> 
</xsl:stylesheet> 

Si se procesa con este ejemplo XML:

<?xml version="1.0" encoding="UTF-8"?> 
<Human> 
    <EyeColor>brown</EyeColor> 
    <HairColor>brown</HairColor> 
</Human> 

Usted consigue algo como:

import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement(name="Human") 
public class Human { 


    private String EyeColor; 
    public String getEyeColor { 
     return EyeColor; 
    } 

    public void setEyeColor(String value) { 
     this.EyeColor = value; 
    } 


    private String HairColor; 
    public String getHairColor { 
     return HairColor; 
    } 

    public void setHairColor(String value) { 
     this.HairColor = value; 
    } 


} 
+0

Gracias, pero no solo estoy interesado en el esquema del documento Xml, sino también en los datos reales que contiene. Entonces, si mi documento xml tiene una propiedad con un nombre dado, quiero que se cree la misma propiedad en el archivo de la clase java. Espero tener algo de sentido. – drozzy

+0

Sí, pero no sería difícil escribir una hoja XSLT para crear una clase Java con las anotaciones JAXB correctas –

+0

@drozzy: Se agregó un ejemplo XSLT –

1

Puede echar un vistazo al proyecto de modelado de Eclipse model to text components.

+0

Gracias, pero antes que nada no sé qué es exactamente lo que hace. Parece que está convirtiendo el código de Java en texto, mientras que lo necesito de otra manera: dado el texto (xml o json) crea una clase java con constantes cuyos valores se dan en el archivo de texto. – drozzy

+0

@drozzy El primer paso sería obtener algún tipo de modelo mediante el análisis del formato de entrada, p. podría analizar su XML con JDOM, y a partir de eso generar los archivos fuente de Java con JET (ver http://www.eclipse.org/articles/Article-JET/jet_tutorial1.html). Otra opción sería usar XML con EMF y usar Xpand para generar sus archivos Java desde el modelo EMF (http://www.openarchitectureware.org/pub/documentation/4.3.1/html/contents/xsd_tutorial.html). –

+0

Gracias, pero el tutorial de JET no es muy claro en cuanto a qué exactamente hace JET. ¿Qué es EMF? – drozzy

2

Bien Eclipse Modeling Framework (EMF) es para la aplicación que está esperando. Supongo que tiene un modelo y desea convertirlo en código. La sugerencia muy específica que puedo dar es JET (plantilla del emisor de Java) que puede consultar aquí para obtener más detalles.

también el marco más reciente XPAND introducido por eclipse,

Girando alrededor de los componentes de sintaxis abstracta de desarrollo son modelo de transformación tecno- logías . 1. modelo a texto (Java plantillas emisor [JET] y Xpand) 2. Modelo de modelo a modelo (QVT y ATL)

se refiere aquí a modelo XML-XSLT/UML (Rose racional).

+0

No puedo encontrar el marco "XPand". ¿Podrías proporcionar un enlace? – drozzy

+0

[Eclipse Xpand] (http://www.eclipse.org/modeling/m2t/?project=xpand) – Verhagen

0

Sí, puede hacerlo utilizando el archivo XML. Cree su propia plantilla de archivo xml y luego use preferences-java-code template-import elija ese archivo y podrá usar esa plantilla.

Cuestiones relacionadas