Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么JAXB生成的类有受保护的成员,我如何更改这些成员?_Java_Xml_Jaxb - Fatal编程技术网

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

Java 为什么JAXB生成的类有受保护的成员,我如何更改这些成员?,java,xml,jaxb,Java,Xml,Jaxb,我一直在互联网上搜索JAXB生成的类保护成员(所有成员,不管继承情况如何)的原因 我希望各位议员不要公开发言 我的搜索结果是空的 我有普通的xsd文件,它们使用Maven和JAXB转换成Java类。理想情况下,生成的成员应该是私有的,但我找不到实现这一点的方法 有没有办法修改这种默认行为?我认为实现这一点的唯一方法是开发一个自己搜索谷歌样本的工具 插件可以做什么? XJC插件参与从模式生成代码。信息技术 它可以定义自己的自定义项,用户可以使用这些自定义项来控制它 可以访问JAXB RI生成的代码

我一直在互联网上搜索JAXB生成的类保护成员(所有成员,不管继承情况如何)的原因

我希望各位议员不要公开发言

我的搜索结果是空的

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


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

我认为实现这一点的唯一方法是开发一个自己搜索谷歌样本的工具

插件可以做什么?

XJC插件参与从模式生成代码。信息技术 它可以定义自己的自定义项,用户可以使用这些自定义项来控制它 可以访问JAXB RI生成的代码,它可以生成 附加的类/方法/字段/注释/注释,它可以 还可以替换编译中的一些可插入性点 进程,如XML名称->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;
    }

}
public类privatemberplugin
扩展插件
{
@凌驾
公共字符串getOptionName()
{
返回“Xpm”;
}
@凌驾
公共字符串getUsage()
{
return“-Xpm:将成员可见性更改为private”;
}
@凌驾
公共布尔运行(大纲模型、选项选项、ErrorHandler ErrorHandler)
抛出SAX异常
{
对于(ClassOutline co:model.getClasses())
{
JDefinedClass jdc=co.implClass;
//通过复制新列表中的字段来避免并发修改
列表字段=新的ArrayList(jdc.fields().values());
for(JFieldVar字段:字段)
{
//如果存在serialVersionUID,请不要对其执行任何操作。
如果(!field.name().equalsIgnoreCase(“serialVersionuid”))
{
//仅尝试更改非私有的成员
if(field.mods().getValue()!=JMod.PRIVATE)
{
//由于无法更改可见性,请删除该字段并重新创建它
jdc.removeField(字段);
field(JMod.PRIVATE,field.type(),field.name());
}
}
}
}
返回true;
}
}

如果您愿意,可以随意使用它。

JAXB生成的类具有受保护的成员,并且可能将它们生成为私有的,您说理想情况下生成的成员应该是私有的,但我找不到实现这一点的方法。。你想让所有成员都保密?正如您所说,它们已经是私有的,但其中一些是受保护的,那么请检查具有受保护字段的类是否被其他类继承,这可能是原因?@JMelnik:我猜这是第一句中的拼写错误。刚刚检查了我的源代码,JAXB使用
protected
修饰符生成所有成员属性(不管继承性如何)。也许OP可以提供一些关于第一句的澄清?修改了第一句。所有成员都受
保护
(无论继承情况如何),但我希望他们是
私有的
。您应该使用您定义的插件编辑我的答案,这样人们就更容易找到解决方案。干得好@马修,我非常感谢你对我答案的修改,但我认为这不相关。这个插件将在从WSDL/XSD转换为Java代码时使用。据我所知,没有任何注释的概念,因此我删除了您的注释。更新版本的Codemodel库允许您更新JMods对象的状态。在这种情况下,您可以调用
JMods#setPrivate()
。您能给我介绍一下如何使用插件吗?现在我正在使用maven插件,我使用
mvnjaxb2:xjc
命令运行它。