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

あなたが言及するフィールドがであると仮定すると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 に答える