2012-02-21 10 views
10

JAXBで生成されたクラスがメンバーを保護している理由をインターネットで検索しています(すべて継承に関係なく)。JAXBで生成されたクラスにメンバーが保護されているのはなぜですか?どのように変更できますか?

私はメンバーが代わりにプライベートになりたいです。

検索が空になりました。

私はMavenとJAXBを使用してJavaクラスに変換され、通常のxsdファイルを持っています。理想的には、生成されたメンバーはプライベートであるべきですが、これを達成する方法を見つけることができません。

このデフォルト動作を変更する方法はありますか?

+0

JAXB生成されたクラスには、メンバーを保護してきたし、おそらく彼らは、プライベートとして生成している、とあなたは理想的に生成されたメンバーがプライベートでなければならないことを言うが、私はあなたがすべてのメンバーがプライベートになりたい、これを達成する方法..を見つけることができませんか?あなたが言っているように、彼らはすでにプライベートですが、そのうちのいくつかは保護されています、そして、保護されたフィールドを持つクラスが他のクラスに継承されているかどうかを確認してください。 – JMelnik

+0

@JMelnik:これは最初の文のスペルミスだと思います。私のソースをチェックするだけで、JAXBは 'protected'修飾子(継承にかかわらず)ですべてのメンバー属性を生成します。多分、OPは最初のセンテンスについて何らかの説明をすることができますか? – home

+0

最初の文を修正しました。すべてのメンバーは(継承にかかわらず)「保護されています」が、私はそれらを「プライベート」にします。 – tom

答えて

10

さて、私は自分の質問に答えるつもりです。 プラグインを作成するのが正しい方法でした。

私は、次のプラグインを書いて、動作しているようです。

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

} 

気軽にご利用ください。

+0

答えを定義したプラグインで編集する必要があります。こうすれば、人々が解決策を見つけやすくなります。よくやった! – JMelnik

+0

@Matthew、私はあなたの編集にあなたの編集を感謝しますが、私はそれが関連しているとは思わない。このプラグインは、WSDL/XSDからJavaコードに移行するときに使用されます。私が知る限り、そのような注釈の概念はないので、私はあなたのメモを削除します。 – tom

+0

新しいバージョンのCodemodelライブラリを使用すると、JModsオブジェクトの状態を更新できます。この場合、 'JMods#setPrivate()'を呼び出すことができます。 – user1808924

6

私はこれを達成する唯一の方法は、サンプル用JXC plugin自分で、検索グーグルを開発することであると思います。

プラグインは何ですか?

XJCプラグインがスキーマからのコード生成に関与します。 は、ユーザがそれを制御するために使用できる独自のカスタマイズを定義できます。 は、JAXB RIが生成するコードにアクセスし、 追加のクラス/メソッド/注釈/コメントを生成することができ、 も一部をプラグイン可能性は、XML名 - > Java名変換などの プロセスのコンパイルを指します。

幸い、質問者が開発しており、shared the pluginです。

関連する問題