Почему классы, созданные JAXB, защищали членов и как я могу это изменить?

Я искал интернет по той причине, почему классы JAXB сгенерировали защищенные члены (все они, независимо от наследования).

Я хотел бы, чтобы члены были приватными.

Мой поиск опустел.

У меня есть обычные xsd файлы, которые преобразуются в классы Java, используя Maven и 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;
    }

}

Не стесняйтесь использовать это, если хотите.

Ответ 2

Я думаю, что единственный способ добиться этого - разработать JXC plugin самостоятельно, искать google для образцов.

Что может сделать плагин?

Плагин XJC участвует в генерации кода из схемы. Это может определять собственные настройки, которые пользователи могут использовать для управления им, это может получить доступ к коду, который генерирует RI JAXB, он может генерировать дополнительные классы/методы/поля/аннотации/комментарии, и это может также замените некоторые точки подключения в компиляции процесс, такой как имя XML → преобразование имени Java.

К счастью, владелец вопроса разработал и разделил плагин.