我没有做太多反思,所以这个问题可能很明显。对于例如我有一节课:
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[]
的字段?
答案 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的答案更好。