我有一个简单的课程
public class SomeService {
private Number number = new Integer(0);
}
是否有可能通过java反射找出上传之前的字段类型?
我可以获取Number类型而不是Integer:
Field field = MealService.class.getDeclaredField("number");
field.setAccessible(true);
System.out.println("impl:"+field.getType());
请告知。
答案 0 :(得分:1)
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());
}
}
答案 1 :(得分:1)
这是完全合乎逻辑的:您从字段类型获得的信息是 声明的类型 。如果要获取实际类型,则需要获取实例字段的实际值。由于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;
}