2012-02-21 20 views
10

Ho cercato su Internet una ragione per cui le classi generate da JAXB hanno membri protetti (tutti, indipendentemente dall'ereditarietà).Perché le classi generate da JAXB hanno membri protetti e come posso modificarlo?

Vorrei che i membri fossero privati.

La mia ricerca è arrivata vuota.

devo normali file XSD che vengono convertiti in classi Java utilizzando Maven e JAXB. Idealmente i membri generati dovrebbero essere privati ​​ma non riesco a trovare un modo per raggiungere questo obiettivo.

C'è un modo per modificare questo comportamento predefinito?

+0

JAXB classi generate hanno protetto i membri e, eventualmente, li hanno generato come private, e si dice che idealmente i membri generati dovrebbero essere privata, ma non riesco a trovare un modo per raggiungere questo .. Si desidera che tutti i membri ad essere privata? Come stai dicendo, sono già private, ma alcune sono protette, quindi controlla se le classi con campi protetti sono ereditate da altre classi, questa potrebbe essere la ragione? – JMelnik

+0

@JMelnik: Immagino che questo sia un errore di ortografia nella prima frase. Ho appena controllato i miei sorgenti e JAXB genera tutti gli attributi dei membri con il modificatore 'protected' (indipendentemente dall'ereditarietà). Forse il PO può fornire alcuni chiarimenti sulla prima sentenza? – home

+0

Modificata la prima frase. Tutti i membri sono "protetti" (indipendentemente dall'eredità), ma voglio che siano "privati". – tom

risposta

10

Bene, ho intenzione di rispondere alla mia domanda. Creare un plugin era la giusta via da percorrere.

ho scritto il seguente plug-in e sembra funzionare.

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

} 

Sentitevi liberi di usare questo se volete.

+0

Dovresti modificare la mia risposta con il tuo plugin definito, in questo modo sarebbe più facile per le persone trovare una soluzione. Buon lavoro! – JMelnik

+0

@Matthew, apprezzo la tua modifica alla mia risposta, ma non penso che sia pertinente. Questo plugin deve essere utilizzato quando si passa da un codice WSDL/XSD a Java. Per quanto ne so, non esiste una tale nozione di annotazioni su nessuna di quelle quindi rimuovo la nota. – tom

+0

La versione più recente della libreria Codemodel consente di aggiornare lo stato dell'oggetto JMods. In questo caso, puoi invocare 'JMods # setPrivate()'. – user1808924

6

Credo che l'unico modo per raggiungere questo obiettivo è quello di sviluppare un JXC plugin te stesso, di ricerca di Google per i campioni.

Cosa può fare un plugin?

Un XJC plug partecipa alla generazione di codice da uno schema. può definire le proprie personalizzazioni che gli utenti possono utilizzare per controllarlo, è possibile accedere al codice generato dal RI JAXB, può generare classi aggiuntive/metodi/campi/annotazioni/commenti e può anche sostituire alcuni di i punti di innesto nel processo di compilazione , come il nome XML -> conversione del nome Java.

Per fortuna, il proprietario della domanda ha sviluppato e shared the plugin.

Problemi correlati