【问题标题】:Using isPrimitive or isArray on Introspector Values在 Introspector 值上使用 isPrimitive 或 isArray
【发布时间】:2012-01-31 04:12:24
【问题描述】:

我正在使用自省来检索 bean 的 get 方法,我希望能够确定结果是数组还是 Primitive,但我总是得到错误的响应。即使我知道类型是 ArrayList。同样,isArray() 是否适用于所有类型的数组,例如原始数组、ArrayList 等?

Class<?> className = bean1.getClass();
ArrayList<ComparatorValue> updateIndexes = new ArrayList<ComparatorValue>();            
BeanInfo beanInfo = Introspector.getBeanInfo(className);
PropertyDescriptor classProperties[] = beanInfo.getPropertyDescriptors();


for(int i=0; i<classProperties.length; i++) {
    Method getter = classProperties[i].getReadMethod();
    System.out.println(getter.invoke(bean1).getClass().isArray()); //Always false.
    System.out.println(getter.invoke(bean1).getClass().isPrimitive()); //Always false.
}

【问题讨论】:

    标签: java introspection


    【解决方案1】:

    集合(ArrayList 等)不是数组。它们是属于Collections 的对象。

    只有数组才是数组;

    int[] foo = new int[5];
    Object[] bar = new Object[4];
    

    那些是数组。 - http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html

    【讨论】:

    • 明白。尽管如此,isPrimitive() 不适用于我知道是原始类型的字段,例如 int 或 String。
    • 呃,String 是一个对象,而不是原语。至于int,这是一个原始但没有看到你在做什么我无法指出哪里出了问题:) 你确定你没有Integer 吗?
    • 基本上我正在尝试测试 bean 中每个 getter 的值是否是 ArrayList、Array、Integer 或 int、String 等。如果它是诸如数组之类的类型,我的代码将需要进一步循环它,否则如果不是,那么我将处理结果(这就是我需要检查的原因)。有没有更好的方法来验证值类型?
    【解决方案2】:

    当您调用该方法时,原始返回值将被装箱到其包装类中。

    getter.invoke(bean1).getClass().isPrimitive()
    

    由于您在包装的返回值上调用 getClassisPrimitve 将返回 false。您可以通过调用getter.getReturnType() 来检索实际的返回类型。

    【讨论】:

      猜你喜欢
      • 2013-02-10
      • 2014-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      • 2018-09-21
      • 2019-08-19
      相关资源
      最近更新 更多