通过反射获取私有字段,在 Java
Get a private field via reflection, in Java
我有一个名为 "MyClass" 的 Java class,它有一个 "AnotherClass" 类型的私有属性。 MyClass 有一个私有构造函数,"AnotherClass" 有 public 构造函数。 "AnotherClass" 还有一个私有字符串字段 "value",它在构造函数中初始化。我想在 "Main" class 中访问这个字符串。
第一个class:
public class MyClass {
private AnotherClass obj;
private MyClass() {
obj = new AnotherClass();
}
}
第二个class:
public class AnotherClass {
private String value;
public AnotherClass() {
value = "You got the private value!";
}
}
主要class:
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);
}
}
}
}
我希望在控制台看到"You got the private value!",但是程序抛出异常:
Exception in thread "main" java.lang.IllegalArgumentException: Can not set java.lang.String field main.AnotherClass.value to java.lang.Class
所以,我想在不修改 "MyClass" 和 "AnotherClass" 的情况下检索私有字段 "value",并且不直接在 main 中从 AnotherClass 调用 public 构造函数() 。我想从 "obj".
中获取值
更改此行
name = (String) myStringField.get(obj.getClass());
至此
name = (String) myStringField.get(obj);
get方法需要对象访问字段(除非是静态字段)
我有一个名为 "MyClass" 的 Java class,它有一个 "AnotherClass" 类型的私有属性。 MyClass 有一个私有构造函数,"AnotherClass" 有 public 构造函数。 "AnotherClass" 还有一个私有字符串字段 "value",它在构造函数中初始化。我想在 "Main" class 中访问这个字符串。
第一个class:
public class MyClass {
private AnotherClass obj;
private MyClass() {
obj = new AnotherClass();
}
}
第二个class:
public class AnotherClass {
private String value;
public AnotherClass() {
value = "You got the private value!";
}
}
主要class:
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);
}
}
}
}
我希望在控制台看到"You got the private value!",但是程序抛出异常:
Exception in thread "main" java.lang.IllegalArgumentException: Can not set java.lang.String field main.AnotherClass.value to java.lang.Class
所以,我想在不修改 "MyClass" 和 "AnotherClass" 的情况下检索私有字段 "value",并且不直接在 main 中从 AnotherClass 调用 public 构造函数() 。我想从 "obj".
中获取值更改此行
name = (String) myStringField.get(obj.getClass());
至此
name = (String) myStringField.get(obj);
get方法需要对象访问字段(除非是静态字段)