有一个普通Java Bean,它的属性域有各种类型(基本类型、类、枚举):
public class Bean { private int a;
private String b;
private Double c;
private TypeEnum d;
...
// setters and getters
}枚举TypeEnum的定义如下:
public enum TypeEnum { enum1, enum2, enum3;
}现在再写一个类,它有一个方法是用反射机制给上面的Bean的每个属性赋值:
public class Interpretor { ... public static void interpret() { ... for ( Field field : Bean.class.getDeclaredFields() ) { // 得到属性域的声名类型
Class<?> clazz = field.getType();
Bean bean = new Bean(); // 这里value是一个字符串。我的意图是把字符串转化为和Bean中属性域声名类型相同的类型后赋值给Bean的属性域
// 举个例子:若value == "123",Bean中的一个属性声名类型为Integer,那么,我把一个new Integer(123)赋值给Bean的这个属性
// 若value == "enum1",Bean中的一个属性声名类型为TypeEnum,那么,我把一个TypeEnum.enum1赋值给Bean的这个属性
// 由于枚举类型不能用构造函数产生,所以typeof函数作了一个重载(其实我不是很肯定这是重载)
field.set( bean, typeof( clazz, value ) ); } } // 这个typeof处理基本类型和除枚举之外的类
public static <T> T typeof( Class<T> clazz, value ) { try { return (T) clazz.getConstructor( String.class ).newInstance( value ); } catch ( ... ) {
...
}
} // 这个typeof只处理枚举
// 或许这个原型声名改为public static <T extends Enum<?>> T typeof( Class<T> clazz, String value )会更好一些?能解决问题就行
public static <T extends Enum<T>> T typeof( Class<T> clazz, value ) { return (T) Enum.valueOf( clazz, value ); }}
按我的想法,枚举类型应该由第二个typeof函数处理的,但实际上,程序选择了第一个typeof函数。也许在Class<?> clazz = field.getType()时,clazz已经不是枚举类型了。但clazz.isEnum()返回的却是true 我的问题是这样的:
在不影响功能的情况下,怎么实现用反射机制对枚举类型的属性域赋值?(这里的枚举类型不只TypeEnum一种,否则我也不选择反射了)
public class Bean { private int a;
private String b;
private Double c;
private TypeEnum d;
...
// setters and getters
}枚举TypeEnum的定义如下:
public enum TypeEnum { enum1, enum2, enum3;
}现在再写一个类,它有一个方法是用反射机制给上面的Bean的每个属性赋值:
public class Interpretor { ... public static void interpret() { ... for ( Field field : Bean.class.getDeclaredFields() ) { // 得到属性域的声名类型
Class<?> clazz = field.getType();
Bean bean = new Bean(); // 这里value是一个字符串。我的意图是把字符串转化为和Bean中属性域声名类型相同的类型后赋值给Bean的属性域
// 举个例子:若value == "123",Bean中的一个属性声名类型为Integer,那么,我把一个new Integer(123)赋值给Bean的这个属性
// 若value == "enum1",Bean中的一个属性声名类型为TypeEnum,那么,我把一个TypeEnum.enum1赋值给Bean的这个属性
// 由于枚举类型不能用构造函数产生,所以typeof函数作了一个重载(其实我不是很肯定这是重载)
field.set( bean, typeof( clazz, value ) ); } } // 这个typeof处理基本类型和除枚举之外的类
public static <T> T typeof( Class<T> clazz, value ) { try { return (T) clazz.getConstructor( String.class ).newInstance( value ); } catch ( ... ) {
...
}
} // 这个typeof只处理枚举
// 或许这个原型声名改为public static <T extends Enum<?>> T typeof( Class<T> clazz, String value )会更好一些?能解决问题就行
public static <T extends Enum<T>> T typeof( Class<T> clazz, value ) { return (T) Enum.valueOf( clazz, value ); }}
按我的想法,枚举类型应该由第二个typeof函数处理的,但实际上,程序选择了第一个typeof函数。也许在Class<?> clazz = field.getType()时,clazz已经不是枚举类型了。但clazz.isEnum()返回的却是true 我的问题是这样的:
在不影响功能的情况下,怎么实现用反射机制对枚举类型的属性域赋值?(这里的枚举类型不只TypeEnum一种,否则我也不选择反射了)
你用C#搞给我看一下我想不是JAVA弱智,你是弱智吧哈哈哈哈
呵呵
我在spring上看到有这种功能的实现