9

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

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[]

4

6 回答 6

19

array instanceof byte[]检查是否array是类型的对象byte[]。但在你的情况下array不是 a byte[],它是一个表示 的类型的Class对象byte[]

您可以访问Class表示某种类型T的a T.class,因此您需要进行以下检查:

if (array == byte[].class) { ... }
于 2012-10-22T09:49:06.517 回答
7

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

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

if(field.getType() == byte[].class)
于 2012-10-22T09:49:23.040 回答
4

试试这个:

Class<?> cls = field.getType();
if (cls.isAssignableFrom(byte[].class)) {
    System.out.println("It's a byte array");
}
于 2012-10-22T09:51:52.593 回答
1

请参阅Oracle 提供的这个有用的教程

数组类型可以通过调用 Class.isArray() 来识别

于 2012-10-22T09:49:06.573 回答
0

如果你试试:

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

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

于 2012-10-22T09:48:56.677 回答
0

你只需要就是

field.getType().getTypeName().equals("byte[]")
于 2021-10-25T06:46:48.247 回答