Поля набора с отражением - Строка не имеют никакого valueOf (Строка) метод

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

Это работает со всеми ними кроме с a 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)?

Спасибо.

8
задан bluish 12 October 2012 в 09:45
поделиться

3 ответа

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

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

8
ответ дан 5 December 2019 в 20:14
поделиться

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

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

0
ответ дан 5 December 2019 в 20:14
поделиться

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

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

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

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

0
ответ дан 5 December 2019 в 20:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: