【问题标题】:Java Reflection - Accessing Fields of a FieldJava 反射 - 访问字段的字段
【发布时间】:2010-11-11 20:14:01
【问题描述】:

假设我有课

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();

但是我收到了垃圾数据(已声明,已公开?)为什么会这样? Java 反射是否不适用于内部类?

【问题讨论】:

标签: java reflection


【解决方案1】:

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

另外,正如 BalusC 所说,要小心。这些字段不一定按照您期望的顺序。

【讨论】:

  • 请将 getFields() 更改为 getDeclaredFields() ...我意识到我使用了错误的方法。您的回答有效,我现在可以访问声明的字段!
【解决方案2】:

这是一个简短的 sn-p,可以提供一些关于反射的提示

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);
    }
}

}

我发现使用反射编写代码很有趣,但很难排除故障......

【讨论】:

    【解决方案3】:

    您可以使用java-util 库的Traverser 类,它在嵌套字段的支持下遍历类的每个字段,这正是您想要的。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-18
      • 1970-01-01
      • 2015-07-08
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      相关资源
      最近更新 更多