Function接受Object并将所有非静态字段存储在Field类型的数组中。 '对于'记录每个非静态字段。如果非静态字段是原始类型,那么' if'部分没事。但如果该字段是一个数组,则else部分会产生问题。线条产生问题突出显示。这是访问阵列的正确方法吗?我程序的这部分代码如下。
public static void printDetails(Object o)
{
// ...
// field is a non-static field of the Class of Object 'o'
String fieldName = field.getType().getName();
if(fieldName.equals("int") || fieldName.equals("float") || fieldName.equals("java.lang.Boolean") || fieldName.equals("long") ||
fieldName.equals("short") || fieldName.equals("char") || fieldName.equals("java.lang.String"))
{
Object sendObj = o, recvObj = null;
recvObj = field.get(sendObj);
System.out.println("\t " + recvObj.toString()); // Ok for primitive data type case
}
else if(field.getType().isArray())
{
Object sendObj = o;
Object recvArray = field.get(sendObj); // returns 'null', array expected
int length = Array.getLength(recvArray);
for(int i=0; i<length; ++i)
{
Object element = Array.get(recvArray, i);
System.out.println(element.toString());
}
}
}
非常感谢任何帮助。
答案 0 :(得分:1)
我的猜测是,您尝试在对象中访问的字段为空。下面是您自己的代码示例,该代码适用于非null的数组,并使用null数组重现您的结果。
哦,我修改了你的方法签名以获取Field参数。只是一个抬头,你要去测试它:
public static void printDetails(Object o, Field field) throws IllegalArgumentException, IllegalAccessException {
代码:
private static class Test {
public int intField;
public int[] nullIntArrayField;
public int[] notNullIntArrayField = new int[]{1,2,3};
}
public static void main(String[] args){
test();
}
private static void test() {
try {
Test test = new Test();
Class testClass = test.getClass();
Field intField = testClass.getField("intField");
printDetails(test, intField);
//works!!!
intField = testClass.getField("notNullIntArrayField");
printDetails(test, intField);
//doesnt work!!!
intField = testClass.getField("intArrayField");
printDetails(test, intField);
} catch (NoSuchFieldException ex) {
Logger.getLogger(Object.class.getName()).log(Level.SEVERE, null, ex);
} catch (SecurityException ex) {
Logger.getLogger(Object.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalArgumentException ex) {
Logger.getLogger(Object.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(Object.class.getName()).log(Level.SEVERE, null, ex);
}
}
答案 1 :(得分:1)
即使我分析了同样的事情。 对象中数组的值为null
import java.lang.reflect.Array; import java.lang.reflect.Field;
class Shape {
int numberOfSides;
int[] arry = new int[100];
public int getNumberOfSides() {
return numberOfSides;
}
public void setNumberOfSides(int numberOfSides) {
this.numberOfSides = numberOfSides;
}
}
公共类App {
public static void main(String[] args) throws ClassNotFoundException,
IllegalArgumentException, IllegalAccessException {
printDetails(new Shape());
}
public static void printDetails(Object o) throws IllegalArgumentException,
IllegalAccessException {
Field[] fields = o.getClass().getDeclaredFields();
Field field = fields[1];
String fieldName = field.getType().getName();
if (fieldName.equals("int") || fieldName.equals("float")
|| fieldName.equals("java.lang.Boolean")
|| fieldName.equals("long") || fieldName.equals("short")
|| fieldName.equals("char")
|| fieldName.equals("java.lang.String")) {
Object sendObj = o, recvObj = null;
recvObj = field.get(sendObj);
System.out.println("\t " + recvObj.toString()); // Ok for primitive
// data type
// case
} else if (field.getType().isArray()) {
Object sendObj = o;
Object recvArray = field.get(sendObj); // returns 'null', array
// expected
int length = Array.getLength(recvArray);
for (int i = 0; i < length; ++i) {
Object element = Array.get(recvArray, i);
System.out.println(element.toString());
}
}
}
}
按原样运行代码。 之后 修改类形状 到
class Shape {
int numberOfSides;
int[] arry;
public int getNumberOfSides() {
return numberOfSides;
}
public void setNumberOfSides(int numberOfSides) {
this.numberOfSides = numberOfSides;
}
}
您将获得例外。 希望这有帮助