当前位置: 首页 > 面试题库 >

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

桓宜
2023-03-14
问题内容

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

我希望成员改为私人。

我的搜索结果是空的。

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

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


问题答案:

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

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

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

}

如果需要,请随意使用。



 类似资料:
  • 我试图理解类中受保护成员的行为。我有一个类,其中包含受保护的整数。 类别: 还有另一个包,它有3个类,和。继承层次结构如下: 第1子类 子课堂 第3子类 在上述代码中,,,,,和工作正常,没有任何可见性问题。但是,,存在可见性问题。 根据JLS§6.6.2.1, 让C是声明受保护成员的类。只允许在C的子类S的主体内进行访问。 此外,如果Id表示实例字段或实例方法,则: 如果访问是通过限定名Q.Id

  • 问题内容: 我为SCJP做准备,我也知道受保护成员的作用域在包中以及在其他包中(在某些情况下,例如只有继承才可能)。 例如:我有三个类作为Parentclass Childclass Friendclass 这背后的原因是什么,在Friendclass中,成员x将不接受为其分配值,而对于Childclass而言,它充当私有成员。 问题答案: 您甚至无法访问,因为具有默认可见性(不受保护)。参见ht

  • 问题内容: 为什么在最终课程中允许受保护的成员? 这不应该是编译时错误吗? 编辑:正如人们指出的那样,您可以使用默认修饰符来获得相同的程序包访问权限。它的行为应该完全相同,因为protected是默认+子类,而final修饰符明确地拒绝了子类,因此我认为答案不只是提供相同的程序包访问。 问题答案: 该改性剂是必要的方法其覆盖从基类的方法,在没有那些构件暴露于所述。 通常,您可以引入很多不必要的规则

  • 我正在阅读这本Java SCJP的书,我偶然发现了以下内容: 但是我得到了这个错误: 那么,出什么问题了?

  • 要使用注释,必须创建一个包含getters和setters的类: 但这会导致有人试图通过调用以下命令来修改此值: 有没有一种方法可以创建注释类,而不使用setter和外部解析器/读取器类?

  • 我们试图使用gradle、xsd和xjc生成JAXB类,JAXB类应该具有XmlRootElement注释,以便可以将其作为web服务响应公开。我们正在跟踪这个链接http://azagorneanu.blogspot.com/2011/09/configure-maven-to-generate-classes.html,这很有帮助,但我们无法找到一个只有gradle的特定示例。所以我们想出了一