【发布时间】:2014-03-10 09:57:10
【问题描述】:
我正在开发这个程序,它将打印与对象相关的所有信息,这些信息包括:
对于 x 中的每个切片(对象层次结构中的类):
打印切片的类名。
-
对于该切片中的每个非静态字段:
- 打印所有字段修饰符,后跟字段名称。
- 打印字段值如下:
- 如果字段为 null,则打印 null。
- 如果字段是原始类型,则打印其值
- 如果字段是字符串,则打印其值
- 如果字段是数组:
- 循环遍历数组中的元素
- 打印索引
- 递归打印数组项的详细信息
- 否则,递归打印字段的详细信息
我已经使用下面的代码打印了几乎所有的信息:
public void print(Object obj) {
Class cl = obj.getClass();
while(cl != null) {
System.out.println("Class Name: " + cl.getName());
Field[] fields = cl.getFields();
System.out.println("FIELDS: ");
for(int i=0; i<fields.length; i++) {
String modifier = Modifier.toString(fields[i].getModifiers());
String name = fields[i].getName();
System.out.print("Modifier: "+modifier+" Name: "+name+ " ");
try {
if(fields[i].get(cl) == null)
System.out.print("Value: NULL");
} catch ( IllegalArgumentException | IllegalAccessException ex) {
Logger.getLogger(JCP.class.getName()).log(Level.SEVERE, null, ex);
}
if(fields[i].getType().isPrimitive())
try {
System.out.println("Value: " + fields[i].get(cl));
} catch ( IllegalArgumentException | IllegalAccessException ex) {
Logger.getLogger(JCP.class.getName()).log(Level.SEVERE, null, ex);
}
if(fields[i].getType().isArray()) {
try {
Object[] object=(Object[])fields[i].get(obj);
System.out.print("Values: ");
for(int j=0;j<object.length;j++){
System.out.print(object[j].toString() + ",");
} } catch ( IllegalArgumentException | IllegalAccessException ex) {
Logger.getLogger(JCP.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
System.out.println();
cl = cl.getSuperclass();
}
}
在以下课程上进行测试:
public class hello {
private int privateField1;
private long privateField2;
public int publicField1;
public int publicField2;
public hello() {
}
}
我得到以下输出:
Class Name: hello
FIELDS:
Mar 10, 2014 2:54:36 PM JCP print
SEVERE: null
java.lang.IllegalArgumentException: Can not set int field hello.publicField1 to java.lang.Class
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164)
Modifier: public Name: publicField1 Modifier: public Name: publicField2
Class Name: java.lang.Object
FIELDS:
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168)
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:55)
at sun.reflect.UnsafeIntegerFieldAccessorImpl.getInt(UnsafeIntegerFieldAccessorImpl.java:56)
at sun.reflect.UnsafeIntegerFieldAccessorImpl.get(UnsafeIntegerFieldAccessorImpl.java:36)
at java.lang.reflect.Field.get(Field.java:379)
at JCP.print(JCP.java:211)
at JCP.start(JCP.java:36)
at Main.main(Main.java:11)
Mar 10, 2014 2:54:36 PM JCP print
SEVERE: null
java.lang.IllegalArgumentException: Can not set int field hello.publicField1 to java.lang.Class
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168)
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:55)
at sun.reflect.UnsafeIntegerFieldAccessorImpl.getInt(UnsafeIntegerFieldAccessorImpl.java:56)
at sun.reflect.UnsafeIntegerFieldAccessorImpl.get(UnsafeIntegerFieldAccessorImpl.java:36)
at java.lang.reflect.Field.get(Field.java:379)
at JCP.print(JCP.java:219)
at JCP.start(JCP.java:36)
at Main.main(Main.java:11)
Mar 10, 2014 2:54:36 PM JCP print
SEVERE: null
java.lang.IllegalArgumentException: Can not set int field hello.publicField2 to java.lang.Class
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168)
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:55)
at sun.reflect.UnsafeIntegerFieldAccessorImpl.getInt(UnsafeIntegerFieldAccessorImpl.java:56)
at sun.reflect.UnsafeIntegerFieldAccessorImpl.get(UnsafeIntegerFieldAccessorImpl.java:36)
at java.lang.reflect.Field.get(Field.java:379)
at JCP.print(JCP.java:211)
at JCP.start(JCP.java:36)
at Main.main(Main.java:11)
Mar 10, 2014 2:54:36 PM JCP print
SEVERE: null
java.lang.IllegalArgumentException: Can not set int field hello.publicField2 to java.lang.Class
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168)
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:55)
at sun.reflect.UnsafeIntegerFieldAccessorImpl.getInt(UnsafeIntegerFieldAccessorImpl.java:56)
at sun.reflect.UnsafeIntegerFieldAccessorImpl.get(UnsafeIntegerFieldAccessorImpl.java:36)
at java.lang.reflect.Field.get(Field.java:379)
at JCP.print(JCP.java:219)
at JCP.start(JCP.java:36)
at Main.main(Main.java:11)
主要是在“fields[i].get(cl)”中抛出所有异常,请帮助我找出获取字段值的问题所在。
【问题讨论】:
标签: java reflection