Java反射调用私有方法和字段,因为调用顺序不同,导致结果不同

Java反射调用私有方法和字段,因为调用顺序不同,导致结果不同,java,Java,我想使用Java反射调用私有方法和字段。下面是我的代码: package javaReflect.test; public class PrivateCar { private String color; protected void drive() { System.out.println("this is private car! the color is:" + color); } } package javaReflect.test; i

我想使用Java反射调用私有方法和字段。下面是我的代码:

package javaReflect.test;

public class PrivateCar {

    private String color;

    protected void drive() {
        System.out.println("this is private car! the color is:" + color);
    }
}

package javaReflect.test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class PrivateCarReflect {

    public static void main(String[] args) throws Throwable {
        ClassLoader loader = Thread.currentThread().getContextClassLoader();

        Class clazz = loader.loadClass("javaReflect.test.PrivateCar");

        PrivateCar pcar = (PrivateCar) clazz.newInstance();

        Field colorFld = clazz.getDeclaredField("color");
        colorFld.setAccessible(true);
        colorFld.set(pcar, "red");

        Method driveMtd = clazz.getDeclaredMethod("drive");
        driveMtd.setAccessible(true);
        driveMtd.invoke(pcar, (Object[]) null);

    }
}
我执行主方法,结果是
这是私家车!颜色为:红色
。但是当我更改调用序列方法和字段时。像这样:

    Method driveMtd = clazz.getDeclaredMethod("drive");
    driveMtd.setAccessible(true);
    driveMtd.invoke(pcar, (Object[]) null);

    Field colorFld = clazz.getDeclaredField("color");
    colorFld.setAccessible(true);
    colorFld.set(pcar, "red");
首先使用反射调用方法。结果是:

this is private car! the color is:null.

我不知道为什么会这样。具体会发生什么情况?

您应该在测试之前设置颜色。这就是为什么第二个代码段没有达到您期望的效果。在正确设置字段之前,不能使用该字段的值,因此,在选择字段之前,不应调用使用该字段的方法。

应在测试颜色之前设置颜色。这就是为什么第二个代码段没有达到您期望的效果。在正确设置字段之前,不能对其使用值,因此在选择字段之前,不应调用使用该字段的方法。

在设置值之前,您正在访问变量。如果没有思考,这看起来像:

PrivateCar car = new PrivateCar();
car.drive(); //color is still null
car.color = "red";
使用反射不会改变此顺序

毫无疑问,您的工作示例如下

PrivateCar car = new PrivateCar();
car.color = "red";
car.drive(); //color is 'red'

在设置值之前,您正在访问变量。如果没有思考,这看起来像:

PrivateCar car = new PrivateCar();
car.drive(); //color is still null
car.color = "red";
使用反射不会改变此顺序

毫无疑问,您的工作示例如下

PrivateCar car = new PrivateCar();
car.color = "red";
car.drive(); //color is 'red'

您肯定需要专家帮助:)在第二种情况下,您调用方法befire color属性被设置,这就是为什么它在打印时为null。基本上,如果您在设置值之前调用该方法,您会问为什么
颜色
为null?您可以在不使用反射的情况下进行尝试,也可以这样做。您在设置颜色之前调用方法,因此o/p是正确的。您肯定需要专家帮助:)在第二种情况下,您在设置颜色属性之前调用方法,这就是为什么打印时基本为空,您会问,如果在设置值之前调用该方法,为什么
颜色
为空?您可以在不使用反射的情况下进行尝试,也可以这样做。您在设置颜色之前调用方法,因此o/p是正确的。