Установить поля с отражением - у String нет метода valueOf(String)

Я устанавливаю публичные поля Objectthis через отражение. И имя поля, и значение задаются как 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 ответа

Решение

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам