Почему сгенерированные JAXB классы имеют защищенных членов и как я могу это изменить? - PullRequest
10 голосов
/ 21 февраля 2012

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

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

Мой поиск оказался пустым.

У меня есть обычные xsd-файлы, которые конвертируются в классы Java с использованием Maven и JAXB. В идеале сгенерированные участники должны быть частными, но я не могу найти способ добиться этого.

Есть ли способ изменить это поведение по умолчанию?

Ответы [ 2 ]

10 голосов
/ 22 февраля 2012

Ну, я собираюсь ответить на свой вопрос. Создание плагина - правильный путь.

Я написал следующий плагин, и он, кажется, работает.

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

}

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

6 голосов
/ 21 февраля 2012

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...