【问题标题】:Java: How to check if a Field is of type java.util.CollectionJava:如何检查字段是否为 java.util.Collection 类型
【发布时间】:2012-01-15 10:34:57
【问题描述】:

我有一个实用方法,它遍历各种类并递归检索字段。我想检查该字段是否为集合。 下面是一些示例代码:

void myMethod(Class<?> classToCheck)

Field[] fields = classToCheck.getDeclaredFields();

for(Field field:fields)
{
   // check if field if a Collection<?>

}

提前感谢您的帮助。

【问题讨论】:

  • 你想测试声明的字段类型是否是Collection的实现,或者任何给定对象中字段引用的实际对象是否实现Collection?如果 a) Field 被声明为 Object,但为其分配了实现 Collection 的对象,或者 b) Field 被声明为 Collection(或后代)但它为 null,则这两个结果会有所不同。

标签: java reflection types


【解决方案1】:
if (Collection.class.isAssignableFrom(field.getType())) {

}

【讨论】:

  • @DJClayworth 不,它返回Class&lt;?&gt;。检查javadoc
  • @user979467 我刚刚测试过,它可以工作。也许你做错了什么?
  • @Bozho 抱歉,我发现文档说它返回了 Type。不知道我现在在哪里找到它,所以我将撤回评论。
  • 确保使用正确的导入进行收藏。不应错误地来自 org.hibernate 包。
【解决方案2】:

你应该使用Class.isAssignableFrom:

if (Collection.class.isAssignableFrom(field.getType())
    ...

【讨论】:

  • isAssignableFrom 接受一个类,其中 getType() 返回一个类型
【解决方案3】:

使用getType() 方法

Field field =  ...;
if ( Collection.class.isAssignableFrom( field.getType() ) ){
  //do something with your collection
}

【讨论】:

  • 不,不是这样。这将获得拥有该字段的类,而不是字段类型
  • 确实如此。我只是通过实际阅读 javadoc 才注意到我的错误。到目前为止,依靠我的记忆。更正了我的答案
【解决方案4】:

//这个if执行

 List<String> cashType = split(" ,AlL ");
 if(cashType instanceof Collection){
     System.out.println("cashType instanceof Collection");
 }else{
     System.out.println("cashType is not instanceof Collection");
 }

//这个执行else

List<String> cashType = split(" ,AlL ");
 if(cashType instanceof Hashtable){
     System.out.println("cashType instanceof Collection");
 }else{
     System.out.println("cashType is not instanceof Collection");
 }

【讨论】:

    【解决方案5】:

    您可以通过以下方式使用getType()

    if (field.getType().equals(Collection.class) {
        // Do something
    }
    

    这仅在字段被声明为Collection 时才有效。如果该字段是 Collection 的子类型,例如 ListVector,它将不起作用。

    【讨论】:

      【解决方案6】:
      for(Field field:fields) { // check if field if a Collection
        Object myInstance = field.get(classInstance); 
          // where classInstance is the instance in which the fields is stored
          if(myInstance instanceof Collection) {
              //Do your thing
          }
      }
      

      这将测试字段“field”(对象类实例的)引用的实际对象是否实现了Collection。如果你想测试声明的 Field 类型是否实现了 Collection 那就不同了。

      【讨论】:

      • 那么它不是一个instanceof Collection。我相信 instanceof 可以正确处理这种情况。
      • 新的编辑清楚地表明这不是 OP 提出的问题,但我将把它留在这里作为参考。
      猜你喜欢
      • 2022-12-18
      • 1970-01-01
      • 2021-08-03
      • 2013-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多