Установить поля с отражением - у String нет метода valueOf (String) - PullRequest
8 голосов
/ 30 мая 2010

Я устанавливаю открытые поля Object this с помощью отражения. И имя поля, и значение задаются как String. Я использую несколько различных типов полей: Boolean, Integer, Float, Double, собственный enum и String.

Работает со всеми из них , за исключением String. Исключением является то, что метод с подписью String.valueOf(String) не существует ... Теперь я использую грязный обходной путь instanceof, чтобы определить, является ли каждое поле строкой, и в этом случае просто скопируйте значение в поле. *

private void setField(String field, String value) throws Exception {
   Field wField = this.getClass().getField(field);

   if(wField.get(this) instanceof String){ //TODO dirrrrty hack
    //stupid workaround as java.lang.String.valueOf(java.lang.String) fails...
    wField.set(this, value);
   }else{
    Method parseMethod = wField.getType().getMethod("valueOf", new Class[]{String.class});
    wField.set(this, parseMethod.invoke(wField, value));
   }
 }

Есть идеи, как избежать этого обходного пути?

Как вы думаете, java.lang.String должен поддерживать метод valueOf(String)?

Спасибо.

Ответы [ 4 ]

8 голосов
/ 30 мая 2010

Как вы заметили, String.valueOf(String) нет. Тем не менее, я бы не стал рассматривать вашу реализацию как хак, просто признание незначительной несогласованности в классах JDK.

Для более надежного преобразования строк в объекты вы можете рассмотреть возможность использования PropertyEditors , который напрямую поддерживает преобразование строк в объекты - реализация для примитивных типов и строк предоставляется по умолчанию.) Тогда ваш метод синтаксического анализа будет согласованным, и расширяемый для обработки различных типов. Еще лучше использовать классы преобразования в Commons Convert и Spring 3 Type Converters , поскольку они ориентированы исключительно на преобразование, а не на редактирование свойств GUI.

0 голосов
/ 10 июня 2013

В случае строки:

Метод parseMethod = wField.getType (). GetMethod ("valueOf", new Class [] {Object.class});

wField.set (this, parseMethod.invoke (wField, value));

0 голосов
/ 30 мая 2010

Как вы думаете, java.lang.String должен поддерживать метод valueOf(String)?

Нет. Это не будет иметь почти никакой ценности вне отражения, и отражение все равно не следует поощрять ( Effective Java 2nd Edition, Item 53: Предпочитают интерфейсы для отражения ).

0 голосов
/ 30 мая 2010

Есть идеи, как избежать этого обходного пути?

Это во многом зависит от реализации parseMethod.

Как вы думаете, java.lang.String должен поддерживать метод valueOf (String)?

Зачем? Это был бы запрет, просто возвращающий свой параметр.

...