2016-07-27 80 views
2

之前,我有一个简单的类Java反射字段类型上溯造型

public class SomeService { 

    private Number number = new Integer(0); 
} 

是否有可能通过Java反射向上转型前场型的手段来发现的?

我只能获得数类型,而不是整数的:

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

请指教。

回答

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

这是完全合乎逻辑的:你从字段类型得到的信息是声明类型。如果你想得到实际的类型,你需要得到实例字段的实际值。由于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; 
}