Java反射 - 访问字段的字段

时间:2010-11-11 20:14:02

标签: java reflection

假设我有班级

class car
{
       int color = 1;
       seats carSeats = new seats();

       class seats
       {
              int numSeats = 4;
       }
}

使用Java反射,我可以使用以下内容:

car c = new car();
Field[] carFields = c.getClass().getDeclaredFields();

carFields将{color,carSeats}作为字段。实例carSeats有另一个名为numSeats的字段。

从技术上讲,我应该能够执行另一个getFields()操作:

Field[] seatFields = carFields[1].getClass().getDeclaredFields();

但我得到了垃圾数据(DECLARED,PUBLIC?)为什么会这样? Java反射不适用于内部类吗?

3 个答案:

答案 0 :(得分:5)

carFields[1].getClass()将代表Field个对象。你想要carFields[1].getType().getDeclaredFields()

另外,正如BalusC评论的那样,要小心。字段不一定按照您期望的顺序。

答案 1 :(得分:0)

这是一个简短的片段,可以提供一些关于Reflection的提示

import java.lang.reflect.Field;

公共类汽车{

int color = 1;
int wheels = 4;
Seats carSeats = new Seats();

class Seats {
    int numSeats = 4;
}

public static void printFields(Field[] fields, Object o) {
    System.out.println(o.getClass());
    try {
        for (int i = 0; i < fields.length; i++) {
            Field f = fields[i];
            f.setAccessible(true);
            System.out.println(f.getName() + " " + 
                    f.getType().getName()  + " " + 
                    f.get(o));

        }
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}

public static void main(String args[]) {
    Car car = new Car();
    Class<?>[] classes = Car.class.getDeclaredClasses();

    printFields(Car.class.getDeclaredFields(), car);
    for (int i = 0; i < classes.length; i++) {
        Class<?> klass = classes[i];
        printFields(klass.getDeclaredFields(), car.carSeats);
    }
}

}

我发现使用使用反射的编写代码很有趣,但实际上很难拍摄...

答案 2 :(得分:0)

您可以使用Traverserjava-util类来遍历类的每个字段,并支持嵌套字段,这就是您想要的。

  

Traverser - 将任何Java对象传递给此Utility类,它将在遍历完整图形时为其遇到的每个对象调用传入的匿名方法。它处理图形中的循环。允许您对对象图中的所有对象执行通用操作。