当字符串名称引用字段时如何获取通用对象上字段的 class
How to get the class of a field on a generic object when field is referenced by string name
我有一个方法接受一个对象和一个字符串(该字符串是对象字段的名称)。所以我从对象 class 获取字段并使用 field.get(object) 获取值。但我想将该值转换为该字段定义的任何 class 。有没有办法在不需要使用@suppressWarnings("unchecked")的情况下进行转换?
这是我的代码。我将其缩短为仅使用一个对象,但原始版本使用了一个对象列表和 returns 一个地图,地图键是字段的对象值,地图值是对象。
public static <T1,T2> T2 getFieldValue(T1 obj, String fieldName){
Field field = null;
T2 value = null;
try {
field = obj.getClass().getField( fieldName );
} catch ( NoSuchFieldException e ) { ... }
if ( field != null ){
try {
value = (T2)field.get(obj); // <--- unchecked cast!!!
} catch ( IllegalAccessException e ) { ... }
}
return value;
}
如果可能的话,我建议为 T2
的 class 传递一个参数。通过传入 Class<T2>
,您可以调用 cast
方法。如果转换无效,此方法将抛出 ClassCastException
。这也将删除未经检查的警告消息。
public static <T1, T2> T2 getFieldValue(T1 obj, String fieldName, Class<T2> cls) {
Field field = null;
T2 value = null;
try {
field = obj.getClass().getField(fieldName);
} catch (NoSuchFieldException e) {
}
if (field != null) {
try {
value = cls.cast(field.get(obj)); // <--- no unchecked cast!!!
} catch (IllegalAccessException e) {
} catch (ClassCastException e) {
}
}
return value;
}
我有一个方法接受一个对象和一个字符串(该字符串是对象字段的名称)。所以我从对象 class 获取字段并使用 field.get(object) 获取值。但我想将该值转换为该字段定义的任何 class 。有没有办法在不需要使用@suppressWarnings("unchecked")的情况下进行转换?
这是我的代码。我将其缩短为仅使用一个对象,但原始版本使用了一个对象列表和 returns 一个地图,地图键是字段的对象值,地图值是对象。
public static <T1,T2> T2 getFieldValue(T1 obj, String fieldName){
Field field = null;
T2 value = null;
try {
field = obj.getClass().getField( fieldName );
} catch ( NoSuchFieldException e ) { ... }
if ( field != null ){
try {
value = (T2)field.get(obj); // <--- unchecked cast!!!
} catch ( IllegalAccessException e ) { ... }
}
return value;
}
如果可能的话,我建议为 T2
的 class 传递一个参数。通过传入 Class<T2>
,您可以调用 cast
方法。如果转换无效,此方法将抛出 ClassCastException
。这也将删除未经检查的警告消息。
public static <T1, T2> T2 getFieldValue(T1 obj, String fieldName, Class<T2> cls) {
Field field = null;
T2 value = null;
try {
field = obj.getClass().getField(fieldName);
} catch (NoSuchFieldException e) {
}
if (field != null) {
try {
value = cls.cast(field.get(obj)); // <--- no unchecked cast!!!
} catch (IllegalAccessException e) {
} catch (ClassCastException e) {
}
}
return value;
}