我一直在网上搜索JAXB生成的类有保护成员的原因(所有这些都是继承的)。
我希望这些成员是私人的。
我的搜索结果是空的。
我有正常的xsd文件,使用Maven和JAXB转换为Java类。理想情况下,生成的成员应该是私有的,但我找不到实现此目的的方法。
有没有办法修改此默认行为?
答案 0 :(得分: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;
}
}
如果您愿意,请随意使用。
答案 1 :(得分:6)
我认为实现这一目标的唯一方法是自己开发JXC plugin,搜索谷歌搜索样本。
插件可以做什么?
XJC插件参与模式的代码生成。它 可以定义用户可以用来控制它的自己的自定义项 可以访问JAXB RI生成的代码,它可以生成 其他类/方法/字段/注释/注释,它可以 还可以替换编译中的一些可插拔点 进程,例如XML名称 - &gt; Java名称转换。
幸运的是,问题所有者已经开发出shared the plugin。