当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Java反射调用私有方法和字段,因为调用顺序不同,导致结果不同》经验,为你挑选了1个好方法。

我想使用Java反射调用私有方法和fields.Below是我的代码:

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

    }
}

我执行主要方法,结果是this is private car! the color is:red.但是当我改变调用序列方法和字段时.像这样:

    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.

我不知道为什么会这样.究竟发生了什么?



1> AxelH..:

您在设置值之前访问变量.如果没有反射,那将是:

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'

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有