Как создать псевдоним для частного внутреннего класса (используя XStream)?

Я создаю псевдонимы для длинных имен классов... Он отлично работает, но один из сериализованных классов является частным внутренним классом. Я не могу придумать способ создать для него псевдоним, кроме как сделать его общедоступным. Мне не нравится это решение, потому что оно не должно быть общедоступным в первую очередь. Но поскольку создание для него псевдонима позволит изменять имена пакетов и классов без необходимости изменять файлы XML (поскольку первый тег — это полное имя класса).

Вот как я создаю псевдонимы:

xstreamInstance.alias("ClassAlias", OuterClass.InnerClassToAlias.class);

Вот почему мне нужен публичный доступ к этому внутреннему классу.

Так что, если кто-нибудь знает трюк с псевдонимом частного внутреннего класса, мне бы очень хотелось об этом услышать.


person Joanis    schedule 02.02.2010    source источник
comment
Я узнал, что у XStream есть два режима: Pure Java и Enhanced. В расширенном режиме XStream, по-видимому, может достичь гораздо большего количества частных/внутренних/статических/и т. д. участников, чем в режиме Pure Java. Но я считаю, что в моем случае я не могу предположить, что все JVM, на которых будет выполняться мой код, будут поддерживаться расширенным режимом XStream (он зависит от JVM).   -  person Joanis    schedule 04.02.2010


Ответы (2)


Вы можете создать класс, подобный следующему, и передать ссылку на метод xstreamInstance методу alias.

public class Parent {
    public void alias(XStream x) {
        x.alias("Kiddie", Parent.Child.class);
    }

    private class Child {

    }
}
person Marcus Leon    schedule 04.02.2010
comment
Похоже, это хорошая идея. Спасибо. Так что у меня есть выбор: сделать класс общедоступным или добавить небольшой метод... Маленький метод очень интересен, поскольку он не позволяет делать то, что не должно быть возможным (например, создавать экземпляр этого внутреннего класса из другого места). - person Joanis; 04.02.2010
comment
Это будет работать, если частный класс находится под вашим контролем. Как можно определить псевдоним для частного класса, который не находится под контролем, например java.util.Arrays$ArrayList? Есть идеи? - person Martin Höller; 13.09.2013
comment
Чтобы ответить на мой собственный вопрос: получите экземпляр рассматриваемого класса и используйте getClass() для экземпляра. Идея взята из этот пост - person Martin Höller; 13.09.2013

Как насчет использования аннотаций для псевдонима?

public class Parent {
    @XStreamAlias("kiddie")
    private class Child {

    }
}

Изменить: увы, анализ аннотаций вложенных классов не поддерживается XStream при запросе анализа родительского класса.

person Christopher Oezbek    schedule 23.02.2010
comment
Не работает для меня. Единственная разница с приведенным выше примером заключается в том, что мой внутренний класс является статическим (вложенным классом). - person Joanis; 01.03.2010
comment
Я просмотрел код XStream, и действительно, он не будет неявно анализировать вложенные классы. - person Christopher Oezbek; 02.03.2010
comment
Аннотации внутренних классов правильно анализируются в режиме автоматического обнаружения, но это имеет ряд последствий. См. раздел xstream.codehaus.org/annotations-tutorial.html#AutoDetect. - person Paolo Fulgoni; 10.12.2014