9

我有一个对象Field field

我想检查是否field是类型对象Foo或数组: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

知道怎么做吗?

谢谢。

4

6 回答 6

19

这是我曾经用来处理 Java 中所有基本类型的数组的一些代码。由于它们没有扩展 Object 类,因此对 Object[] 的 instanceof 检查是不够的。

/* 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. */
    }
}
于 2012-06-19T19:27:56.133 回答
3

简单的比较应该可以

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[]");
            } 
        }
}

}

于 2012-06-19T19:21:52.193 回答
2

假设您提到的字段是 a java.lang.reflect.Field,您可以这样做

field.getType().equals(Foo.class) || field.getType().equals(Foo[].class)
于 2012-06-19T19:21:05.807 回答
0
if (field instanceof Object[])

那应该这样做。

于 2012-06-19T19:18:58.047 回答
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!");
        }
    }
}
于 2012-06-19T19:20:23.460 回答
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());
}
于 2012-06-19T19:38:12.217 回答