2012-02-21 15 views
10

He estado buscando en Internet un motivo por el cual las clases generadas por JAXB tienen miembros protegidos (todos ellos, independientemente de la herencia).¿Por qué las clases generadas por JAXB tienen miembros protegidos y cómo puedo cambiar esto?

Me gustaría que los miembros sean privados en su lugar.

Mi búsqueda ha resultado vacía.

Tengo archivos xsd normales que se convierten en clases Java utilizando Maven y JAXB. Idealmente, los miembros generados deberían ser privados, pero no puedo encontrar la forma de lograrlo.

¿Hay alguna manera de modificar este comportamiento predeterminado?

+0

Las clases generadas por JAXB tienen miembros protegidos y posiblemente los hayan generado como privados, y usted dice que Idealmente, los miembros generados deberían ser privados pero no puedo encontrar la manera de lograrlo ... ¿Quiere que TODOS los miembros sean privados? Como dices, ya son privados, pero algunos de ellos están protegidos, luego verifica si las clases que tienen campos protegidos son heredadas por otras clases, ¿esa puede ser la razón? – JMelnik

+0

@JMelnik: Supongo que esto es un error ortográfico en la primera oración. Acabo de consultar mis fuentes y JAXB genera todos los atributos de miembro con el modificador 'protected' (independientemente de la herencia). ¿Tal vez el OP puede proporcionar alguna aclaración sobre la primera sentencia? – home

+0

Se modificó la primera oración. Todos los miembros están 'protegidos' (independientemente de la herencia) pero quiero que sean' privados'. – tom

Respuesta

10

Bueno, voy a responder a mi propia pregunta. Crear un plugin era el camino correcto a seguir.

Escribí el siguiente complemento y parece que funciona.

public class PrivateMemberPlugin 
    extends Plugin 
{ 

    @Override 
    public String getOptionName() 
    { 
     return "Xpm"; 
    } 

    @Override 
    public String getUsage() 
    { 
     return " -Xpm : Change members visibility to private"; 
    } 

    @Override 
    public boolean run(Outline model, Options opt, ErrorHandler errorHandler) 
     throws SAXException 
    { 
     for (ClassOutline co : model.getClasses()) 
     { 

      JDefinedClass jdc = co.implClass; 
      // avoid concurrent modification by copying the fields in a new list 
      List<JFieldVar> fields = new ArrayList<JFieldVar>(jdc.fields().values()); 
      for (JFieldVar field : fields) 
      { 
       // never do something with serialVersionUID if it exists. 
       if (!field.name().equalsIgnoreCase("serialVersionuid")) 
       { 
        // only try to change members that are not private 
        if (field.mods().getValue() != JMod.PRIVATE) 
        { 
         // since there is no way to change the visibilty, remove the field an recreate it 
         jdc.removeField(field); 
         jdc.field(JMod.PRIVATE, field.type(), field.name()); 

        } 
       } 
      } 

     } 
     return true; 
    } 

} 

Siéntase libre de utilizar esto si lo desea.

+0

Debe editar mi respuesta con su complemento definido, de esta forma sería más fácil para las personas encontrar una solución. ¡Buen trabajo! – JMelnik

+0

@Matthew, aprecio tu edición de mi respuesta, pero no creo que sea relevante. Este complemento se utilizará al pasar de un código WSDL/XSD a Java. Por lo que yo sé, no existe tal noción de anotaciones en ninguno de ellos, por lo tanto, elimino su nota. – tom

+0

La versión más reciente de la biblioteca Codemodel le permite actualizar el estado del objeto JMods. En este caso, podría invocar 'JMods # setPrivate()'. – user1808924

6

Creo que la única forma de lograr esto es desarrollando un JXC plugin usted mismo, busque muestras en google.

¿Qué puede hacer un complemento?

Un complemento XJC participa en la generación de código desde un esquema. Es puede definir sus propias personalizaciones que los usuarios pueden usar para controlarlo, puede acceder al código que genera JAXB RI, puede generar clases/métodos/campos/anotaciones/comentarios adicionales, y puede también reemplazar algunos de los puntos de pluggabilidad en el proceso de compilación , como nombre XML -> conversión de nombre de Java.

Afortunadamente, el propietario de la pregunta se ha desarrollado y shared the plugin.

Cuestiones relacionadas