这是完全合乎逻辑的:你从字段类型得到的信息是声明类型。如果你想得到实际的类型,你需要得到实例字段的实际值。由于polymorphism你不能提前确定一个值的实际类型。
在您的示例中,您无法更改number
的值,但在现实生活中很少出现这种情况。 例如:
public class SomeService {
private Number number = new Integer(0);
private void setNumber(Number number){
this.number = number;
}
}
如果你这样做?
SomeService service = new SomeService();
service.setNumber(new Double(0));//or more vicious : service.setNumber(0.0)
因此,为了获得值的类型,最简单的办法就是呼吁值getClass
或(尤其是如果你想向上转型)使用instanceof
。例如,如果您绝对想要使用反射:
Field field = SomeService.class.getDeclaredField("number");
field.setAccessible(true);
Object value = field.get(service);
if(value instanceof Integer){
Integer intValue = (Integer)value;
}