Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java反射-访问字段的字段_Java_Reflection - Fatal编程技术网

Java反射-访问字段的字段

Java反射-访问字段的字段,java,reflection,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(); carFie

假设我上课

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反射对内部类不起作用吗?

carFields[1]。getClass()
将表示一个
字段
对象。您需要
carFields[1].getType().getDeclaredFields()


此外,正如巴卢斯克评论的那样,要小心。这些字段不一定按照您期望的顺序排列。

carFields[1]。getClass()
将表示一个
字段
对象。您需要
carFields[1].getType().getDeclaredFields()


此外,正如巴卢斯克评论的那样,要小心。这些字段不一定按照您期望的顺序排列。

这里有一个简短的片段,可以提供一些关于反射的提示

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);
    }
}
int color=1;
int轮=4;
座椅车辆座椅=新座椅();
班级座位{
int numsets=4;
}
公共静态void打印字段(字段[]字段,对象o){
System.out.println(o.getClass());
试一试{
for(int i=0;i
}


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

下面是一个简短的片段,可以提供一些关于反射的提示

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);
    }
}
int color=1;
int轮=4;
座椅车辆座椅=新座椅();
班级座位{
int numsets=4;
}
公共静态void打印字段(字段[]字段,对象o){
System.out.println(o.getClass());
试一试{
for(int i=0;i
}

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

您可以使用库的类,它在嵌套字段的支持下遍历类的每个字段,这正是您所需要的

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

您可以使用库的类,它在嵌套字段的支持下遍历类的每个字段,这正是您所需要的

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


关于
carFields[1]
的注意事项:字段为!关于
carFields[1]
的注意事项:字段为!请将getFields()更改为getDeclaredFields()。。。我意识到我使用了错误的方法。你的答案有效,我现在可以访问声明的字段了!请将getFields()更改为getDeclaredFields()。。。我意识到我使用了错误的方法。你的答案有效,我现在可以访问声明的字段了!