当前位置: 首页 > 面试题库 >

通过反射访问Java中的私有变量

濮阳翔
2023-03-14
问题内容

我正在尝试编写一种使用反射将在类中获取私有字段的方法。

这是我的课程(此示例已简化):

public class SomeClass {
    private int myField;

    public SomeClass() {
        myField = 42;
    }

    public static Object getInstanceField(Object instance, String fieldName) throws Throwable {
        Field field = instance.getClass().getDeclaredField(fieldName);
        return field.get(instance);
    }
}

所以说我这样做:

SomeClass c = new SomeClass();
Object val = SomeClass.getInstanceField(c, "myField");

我得到一个IllegalAccessException因为myField是私人的。有没有一种方法可以使用反射来获取/设置私有变量?(我已经在C#中完成了,但这是我第一次在Java中尝试过它)。如果您想知道为什么需要这样做:),这是因为有时在单元测试期间,将私有变量设置为虚假值以进行故障测试等很方便。


问题答案:

弄清楚了。需要

field.setAccessible(true);


 类似资料:
  • 问题内容: 我找到了一种通过来获取继承成员并通过来获得 ; 私有成员的方法,但是我正在寻找私有的继承字段。我怎样才能做到这一点? 问题答案: 这应该演示如何解决它: (或Class.getDeclaredFields用于所有字段的数组。) 输出:

  • 通过下列任意一个方法访问成员变量时将返回 Field 类型的对象或数组。 getFields() getField(String name) getDeclaredFields() getDeclaredField(String name) 上述方法返回的 Field 对象代表一个成员变量。例如,要访问一个名称为 price 的成员变量,示例代码如下: Field 类的常用方法如表 1 所示 表1

  • 问题内容: Java中是否可以通过反射访问私有字段str?例如获取该字段的值。 问题答案: 是。 然后,使用字段对象获取类实例上的值。 请注意,方法通常会使人们感到困惑。你有该字段,但没有该对象的实例。你必须将其传递给方法

  • 问题内容: 考虑这个例子: 允许您通过反射来访问类的私有字段似乎是不合逻辑的。为什么有这样的功能?允许这样的访问不是“危险”吗? 问题答案: 专用旨在防止意外滥用,而不是作为一种安全机制。如果您选择绕过它,那么您可以自行承担风险,并假设您知道自己在做什么。

  • 要 动态获取一个对象方法的信息,首先需要通过下列方法之一创建一个 类型的对象或者数组。 getMethods() getMethods(String name,Class<?> …parameterTypes) getDeclaredMethods() getDeclaredMethods(String name,Class<?>...parameterTypes) 如果是访问指定的构造方法,需要

  • 我知道我们可以通过反射访问私有构造函数,就像@Sanjay T.Sharma在回答我的问题时提到的:“instanceof void”总是返回false吗? 不过,@Duffymo表示: 您可以使用反射访问私有的所有东西--方法、构造函数、数据成员、所有东西。 如何访问私有方法和私有数据成员? 是否可以通过反射访问局部变量? 是否有方法防止任何人访问私有构造函数、方法和数据成员?