Виртуальная песочница (тм)

Friday, January 11, 2013

Что делать с "java.lang.IllegalAccessException: Class sun.reflect.misc.Trampoline can not access a member of class" или несколько детских граблей при работе с JavaBeans

Допустим, вы не каждый день пишете свои собственные JavaBeans, a тут вдруг польстились на возможность класса XMLEncoder легко и непринужденно сериализовать объекты в XML и решили написать небольшой proof-of-concept примерчик, чтобы удостовериться, что оно все работает, как обещано. С кем, в конце концов, не бывает...

"Если с первого раза не получилось, парашютный спорт не для вас..." При попытке запуситть наш простой примерчик мы получаем в консоли следующее послание от компилятора:

java.lang.IllegalAccessException: Class sun.reflect.misc.Trampoline can not access a member of class Ххх with modifiers ""
Continuing ...

Вопрос: за что и что нам с этим делать?

Solution: make the class of the JavaBean public. :)


Пример #1, показывающий, что класс JavaBean нужно делать публичным




Пример #2, в котором полное счастье так и не наступает

Хорошо, мы выносим класс бина в отдельный файл и делаем его публичным, и он даже компилируется:


После чего тем, что осталось, пытаемся сериализовать его в XML:


В итоге в консоли чисто, а в текущем каталоге мы получаем такой файлик:


Уже гораздо приятнее - мы видим ссылку на объект класса MyBean_B, но хотелось бы какого-то упоминания свойств этого объекта... Может быть инициализация поможет?


Нет, не поможет, дело в том, что XMLEncoder сравнивает значения свойств со значениями по умолчанию (сразу после создания объекта), и если они совпадают, то не сериализуются. Действительно - зачем?


Пример #3, в котором уже почти хорошо

Добавим для разнообразия в наш бин немножечко BigDecimal:

И даже присвоим ему какое-нибудь значение не по умолчанию:


String - видим, int - видим, BigDecimal - не видим:


Очень жаль...


Пример #4, в котором Kuldeep.Oli избавляет нас от страданий, поведав о java.beans.PersistenceDelegate




Ссылки по теме:
JavaBeans Trail in The Java Tutorials from Sun Oracle.
Javadoc for class java.beans.XMLEncoder

No comments: