检查java.lang.reflect.Field类型是否为字节数组

时间:2012-10-22 09:47:01

标签: java reflection

我没有做太多反思,所以这个问题可能很明显。对于例如我有一节课:

public class Document {

    private String someStr;    

    private byte[] contents;  

    //Getters and setters

}

我正在尝试检查字段contents是否是字节数组的实例。我尝试了什么:

Class clazz = Document.class;
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
    if (field.getType().isArray()) {
        Object array = field.getType();
        System.out.println(array);
    }
}

此代码的输出为:class [B。我看到找到了字节数组,但如果我这样做:

if (array instanceof byte[]) {...}

此条件永远不会true。这是为什么?以及如何检查对象是否包含类型为byte[]的字段?

5 个答案:

答案 0 :(得分:18)

array instanceof byte[]检查array是否为byte[]类型的对象。但在您的情况下array不是byte[],它是Class类型的对象,代表byte[]

您可以访问代表某种类型Class T的{​​{1}},因此您需要进行以下检查:

T.class

答案 1 :(得分:7)

如果数组只是一个类instanceof Class将是真的..

如果要检查可以使用的字段类型

if(field.getType() == byte[].class)

答案 2 :(得分:4)

试试这个:

Class<?> cls = field.getType();
if (cls.isAssignableFrom(byte[].class)) {
    System.out.println("It's a byte array");
}

答案 3 :(得分:1)

请参阅this useful tutorial from Oracle

  

可以通过调用Class.isArray()

来识别数组类型

答案 4 :(得分:0)

如果您尝试:

Class<?> array = field.getType();
System.out.println(array.getCanonicalName());

打印byte[]。但@ axtavt的答案更好。