Установить поля с отражением - у String нет метода valueOf(String)
Я устанавливаю публичные поля 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 ответа
Как вы заметили, нет 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));