2012-06-19 98 views
8

我有一个对象Field field如何检查某个对象是否为某种类型的数组

我想检查fieldFoo类型的对象还是数组:Foo[]

的伪代码:

if field.getType() is Foo || field.getType is Foo[] 

这可能吗?

我已经试过

if (field.getType().isArray()) 
    // do something 

但这只会让我检查field是一个数组。

这样做,相反,只会检查它是否的Foo

if (Foo.class.isAssignableFrom(field.getType()) 
    // do something 

对象不知道如何做到这一点?

谢谢。

+0

“我有一个对象场场”?你的对象是Field类型的。是你检查它的Foo或Foo [] –

+0

我编辑了我的答案(现在是一个新的:-)) – Ixx

回答

16

下面是一些代码,我用了一次处理所有基本类型在Java中的数组。由于它们不扩展Object类,所以检查Object []的实例是不充分的。

/* Check if the given object is an array. */ 
if (object.getClass().isArray()) { 

    Class<?> componentType; 
    componentType = object.getClass().getComponentType(); 

    if (componentType.isPrimitive()) { 

     if (boolean.class.isAssignableFrom(componentType)) { 
      for (boolean anElement : (boolean[]) object) { 
       /* ... */ 
      } 
     } 

     else if (byte.class.isAssignableFrom(componentType)) { 
      /* ... */ 
     } 

     else if (char.class.isAssignableFrom(componentType)) { 
      /* ... */ 
     } 

     else if (double.class.isAssignableFrom(componentType)) { 
      /* ... */ 
     } 

     else if (float.class.isAssignableFrom(componentType)) { 
      /* ... */ 
     } 

     else if (int.class.isAssignableFrom(componentType)) { 
      /* ... */ 
     } 

     else if (long.class.isAssignableFrom(componentType)) { 
      /* ... */ 
     } 

     else if (short.class.isAssignableFrom(componentType)) { 
      /* ... */ 
     } 

     /* No else. No other primitive types exist. */ 
    } 

    else { 
     /* Do something with Object[] here. */ 
    } 
} 
+0

Thanhks。这是我需要的 –

0
if (field instanceof Object[]) 

应该这样做。

0

,数组类型具体化,你可以只使用

if (field.getType() == Foo.class || field.getType() == Foo[].class) { 
} 

完整的示例:

public class Scratchpad { 
    String[] strings; 

    public static void main(String[] args) throws NoSuchFieldException { 
     if (Scratchpad.class.getDeclaredField("strings").getType() == String[].class) { 
      System.out.println("They're Strings!"); 
     } 

     if (Scratchpad.class.getDeclaredField("strings").getType() == Long[].class) { 
      System.out.println("They're Longs!"); 
     } 
    } 
} 
+0

我不相信'Foo [] .class'甚至会编译。 –

+0

显然,我只是尝试'Foo []。class',这不是一个有效的语法 –

+0

在Java 6上适合我。 –

2

假设你提到的字段是java.lang.reflect.Field,你可以做

field.getType().equals(Foo.class) || field.getType().equals(Foo[].class) 
2

简单比较应该可以工作

import java.lang.reflect.Field; 

public class Main { 

String[] myStringArray; 
String[] myStringArray2; 

Object[] myObjectArray; 

String str; 


public static void main(String... args) { 
     Field[] flds = Main.class.getDeclaredFields(); 
     for (Field f : flds) { 
      Class<?> c = f.getType(); 

      if (c == String[].class) { 
       System.out.println("field" + f.getName() + " is String[]"); 
      } 
      if (c == String.class) { 
       System.out.println("field" + f.getName() + " is String"); 
      } 
      if (c == Object[].class) { 
       System.out.println("field" + f.getName() + " is Object[]"); 
      } 
     } 
} 

}

0

我会做这样的事情:

public static void main(String[] args) { 
    Foo foo = new Foo(); 
    Foo[] other = new Foo[1]; 
    other[0] = new Foo(); 

    System.out.println(isFooOrArrayOfFoo(foo)); 
    System.out.println(isFooOrArrayOfFoo(other[0])); 
    System.out.println(isFooOrArrayOfFoo(new Object())); 
} 

private static boolean isFooOrArrayOfFoo(Object o) { 
    return (o instanceof Foo || o.getClass().equals(Foo.class) && o.getClass().isArray()); 
} 
相关问题