gpt4 book ai didi

java - 在Java中通过反射获取私有(private)字段

转载 作者:行者123 更新时间:2023-12-02 08:41:47 25 4
gpt4 key购买 nike

我有一个名为“MyClass”的 Java 类,具有私有(private)属性,类型为“AnotherClass”。 MyClass 有一个私有(private)构造函数,而“AnotherClass”有一个公共(public)构造函数。 “AnotherClass”还有一个私有(private)字符串字段“value”,它在构造函数中初始化。我想在“Main”类中访问这个字符串。

第一个类:

public class MyClass {
private AnotherClass obj;

private MyClass() {
obj = new AnotherClass();
}
}

第二课:

public class AnotherClass {
private String value;

public AnotherClass() {
value = "You got the private value!";
}
}

主类:

public class Main {

static String name;
static AnotherClass obj;

public static void main(String[] args) throws Exception {
Class myClass;
myClass = Class.forName("main.MyClass");
Constructor<MyClass>[] constructors = myClass
.getDeclaredConstructors();
for (Constructor c : constructors) {
if (c.getParameters().length == 0) {
c.setAccessible(true);
MyClass myCls= (MyClass) c.newInstance();
Field myObjField = myClass
.getDeclaredField("obj");
myObjField.setAccessible(true);
obj = (AnotherClass) myObjField.get(myCls);

// If "value" is public, the program prints "You got the private value!"
// So "obj" is returned correctly, via reflection
// name = obj.value;
// System.out.println(name);

// Now I want to get the field "value" of "obj"
Field myStringField = obj.getClass().getDeclaredField("value");
myStringField.setAccessible(true);

// This line throws an exception
name = (String) myStringField.get(obj.getClass());

System.out.println(name);
}
}
}
}

我希望在控制台中看到“你获得了私有(private)值!”,但是程序抛出了异常:

Exception in thread "main" java.lang.IllegalArgumentException: Can not set java.lang.String field main.AnotherClass.value to java.lang.Class

因此,我想检索私有(private)字段“value”,而不修改“MyClass”和“AnotherClass”,并且不直接在 main() 中调用 AnotherClass 的公共(public)构造函数。我想从“obj”获取值。

最佳答案

更改此行

name = (String) myStringField.get(obj.getClass());

到此

name = (String) myStringField.get(obj);

get方法需要一个对象来访问...的字段(除非是静态字段)

关于java - 在Java中通过反射获取私有(private)字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61347127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com