【问题标题】:Why do JAXB generated classes have protected members and how can I change this?为什么 JAXB 生成的类具有受保护的成员,我该如何更改?
【发布时间】:2012-02-21 12:50:02
【问题描述】:

我一直在互联网上搜索 JAXB 生成的类具有受保护成员的原因(所有这些成员,无论继承如何)。

我希望成员改为私有。

我的搜索结果为空。

我有普通的 xsd 文件,这些文件使用 Maven 和 JAXB 转换为 Java 类。理想情况下,生成的成员应该是私有的,但我找不到实现这一点的方法。

有没有办法修改这个默认行为?

【问题讨论】:

  • JAXB 生成的类具有受保护的成员,并且可能将它们生成为私有的,并且您说理想情况下生成的成员应该是私有的,但我找不到实现这一点的方法。您希望所有成员是私人的?正如您所说,它们已经是私有的,但其中一些是受保护的,然后检查具有受保护字段的类是否被其他类继承,可能是这个原因?
  • @JMelnik:我猜这是第一句话的拼写错误。刚刚检查了我的来源,JAXB 使用 protected 修饰符生成所有成员属性(无论继承如何)。也许OP可以对第一句话提供一些澄清?
  • 修改了第一句。所有成员都是protected(不管继承),但我希望他们是private

标签: java xml jaxb


【解决方案1】:

好吧,我将回答我自己的问题。 创建插件是正确的方法。

我编写了以下插件,它似乎可以工作。

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

}

如果需要,请随意使用。

【讨论】:

  • 您应该使用您定义的插件编辑我的答案,这样人们会更容易找到解决方案。干得好!
  • @Matthew,非常感谢您对我的回答进行的编辑,但我认为这无关紧要。从 WSDL/XSD 到 Java 代码时,将使用此插件。据我所知,其中任何一个都没有这样的注释概念,因此我删除了你的注释。
  • 较新版本的 Codemodel 库允许您更新 JMods 对象的状态。在这种情况下,您可以调用JMods#setPrivate()
  • 能否请您指导我如何使用插件?现在我正在使用 maven 插件,我使用 mvn jaxb2:xjc 命令运行它。
【解决方案2】:

我认为实现这一目标的唯一方法是自己开发一个JXC plugin,在 google 上搜索示例。

插件能做什么?

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

幸运的是,问题所有者已经开发和shared the plugin

【讨论】:

    猜你喜欢
    • 2012-01-21
    • 2013-03-05
    • 1970-01-01
    • 2018-10-21
    • 2023-03-07
    • 1970-01-01
    • 2023-03-18
    • 2016-07-23
    • 1970-01-01
    相关资源
    最近更新 更多