Java反射 - 访问字段的字段
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java反射 - 访问字段的字段相关的知识,希望对你有一定的参考价值。
假设我有班级
class car
{
int color = 1;
seats carSeats = new seats();
class seats
{
int numSeats = 4;
}
}
使用Java反射,我可以使用以下内容:
car c = new car();
Field[] carFields = c.getClass().getDeclaredFields();
carrFields将{color,car Seats}作为字段。实例carSeats有另一个名为num Seats的字段。
从技术上讲,我应该能够执行另一个getFields()操作,以便:
Field[] seatFields = carFields[1].getClass().getDeclaredFields();
但是我得到了垃圾数据(DECLARED,PUBLIC?)为什么会这样? Java反射不适用于内部类吗?
答案
carFields[1].getClass()
将代表一个Field
对象。你想要carFields[1].getType().getDeclaredFields()
。
另外,正如BalusC评论的那样,要小心。字段不一定按您期望的顺序排列。
另一答案
这是一个简短的片段,可以给出一些关于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);
}
}
}
我发现使用使用反射的编写代码很有趣,但很难拍摄...
另一答案
您可以使用Traverser类的java-util库,它可以在嵌套字段的支持下遍历类的每个字段,这就是您想要的。
Traverser - 将任何Java对象传递给此Utility类,它将在遍历完整图形时为它遇到的每个对象调用传入的匿名方法。它处理图形中的循环。允许您对对象图中的所有对象执行通用操作。
以上是关于Java反射 - 访问字段的字段的主要内容,如果未能解决你的问题,请参考以下文章