在向上转换之前的javareflection字段类型

我有一个简单的课程

public class SomeService { private Number number = new Integer(0); } 

在向上转换之前,是否可以通过javareflection找出字段类型?

我可以获取Number类型而不是Integer:

 Field field = MealService.class.getDeclaredField("number"); field.setAccessible(true); System.out.println("impl:"+field.getType()); 

请指教。

 field.getType() returns the declared type. 

如果您想知道实例化类型,则必须首先实例化该字段。

 import java.lang.reflect.Field; public class InstanceTypeInfo { private Number num = new Integer(0); public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException { InstanceTypeInfo dI = new InstanceTypeInfo(); Field field = dI.getClass().getDeclaredField("num"); System.out.println("Instance Type :" + field.get(dI).getClass()); System.out.println("Decleration Type:" + field.getType()); } } 

这是完全合乎逻辑的:从字段类型获得的信息是声明的类型 。 如果要获取实际类型,则需要获取实例字段的实际值。 由于多态性,您无法事先确定值的实际类型。

在您的示例中,您无法更改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或(特别是如果要进行upcast)使用instanceof 。 例如,如果您绝对想要使用reflection:

 Field field = SomeService.class.getDeclaredField("number"); field.setAccessible(true); Object value = field.get(service); if(value instanceof Integer){ Integer intValue = (Integer)value; }