Проблема с BeanUtils из Apache

#java #apache-commons-beanutils

#java #apache-commons-beanutils

Вопрос:

Я пытаюсь установить свойство в компоненте, и, похоже, я не могу заставить BeanUtils работать…

Вот небольшой пример проблемы, с которой я сталкиваюсь.

 public class Example
{
    public static void main(Strin&[] ar&s)
    {
        Example example = new Example();
        example.run();
    }
    public void run()
    {
        try
        {
            Bean bean = new Bean();
            BeanUtils.setProperty(bean, "name", "myName");
            System.out.println(bean.&etName());
        } catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }
    private class Bean
    {
        private Strin& name;

        public Strin& &etName()
        {
            return name;
        }

        public void setName(Strin& name)
        {
            this.name = name;
        }
    }
}
  

Когда я запускаю это, я получаю исключение InvocationTar&etException, говорящее «Не удается установить name» Также, когда я ввожу строку свойства в «Name», я не получаю ошибку, но имя не задано.

Кто-нибудь может указать мне правильное направление относительно того, где я ошибаюсь?

Ответ №1:

удалите атрибут private из класса Bean. Поскольку BeanUtils использует отражение, он не может получить доступ к методу ‘setName’. Причина, по которой вы можете получить доступ к закрытому внутреннему классу обычным образом, заключается в том, что компилятор java выполняет специальные трюки, позволяющие вам получить доступ. Но поскольку BeanUtils не использует эти приемы, это невозможно.

Комментарии:

1. Создание для класса Bean собственного класса верхнего уровня должно заставить его работать, верно?

2. Если он общедоступен или защищен пакетом и находится в том же пакете, что и класс Example, да.

3. Нет, это не сработало, ранее у меня был класс bean public и в его собственном java-файле… Я сделал ее приватной только тогда, когда создавал сокращенную версию своей проблемы для публикации здесь, в отличие от публикации большого количества нежелательного кода.

4. я изменил класс Bean на public и создал java -classpath .:commons-beanutils.jar:commons-lo&&in&.jar Пример, и это сработало.