为什么JAXB生成的类有受保护的成员,我该如何更改?

tom*_*tom 10 java xml jaxb

我一直在网上搜索JAXB生成的类有保护成员的原因(所有这些都是继承的).

我希望这些成员是私人的.

我的搜索空洞了.

我有正常的xsd文件,使用Maven和JAXB转换为Java类.理想情况下,生成的成员应该是私有的,但我找不到实现此目的的方法.

有没有办法修改此默认行为?

tom*_*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;
    }

}
Run Code Online (Sandbox Code Playgroud)

如果您愿意,请随意使用.


JMe*_*nik 6

我认为实现这一目标的唯一方法是自己开发一个JXC插件,搜索谷歌搜索样本.

插件可以做什么?

XJC插件参与模式的代码生成.它可以定义用户可以用来控制它的自己的自定义,它可以访问JAXB RI生成的代码,它可以生成额外的类/方法/字段/注释/注释,它还可以替换一些可插拔点.编译过程,如XML名称 - > Java名称转换.

幸运的是,问题所有者已经开发并共享了该插件.