在向上转换之前的java反射字段类型

时间:2016-07-27 16:04:56

标签: java reflection

我有一个简单的课程

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());

请告知。

2 个答案:

答案 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;
}