在向上转换之前的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; }