簡體   English   中英

通過反射獲取私有字段,在 Java

[英]Get a private field via reflection, in Java

我有一個名為“MyClass”的 Java class 具有私有屬性,類型為“AnotherClass”。 MyClass 有一個私有構造函數,而“AnotherClass”有一個公共構造函數。 “AnotherClass”還有一個私有字符串字段“value”,它在構造函數中初始化。 我想在“主要”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); 
            }
        }
    }
}

我希望在控制台中看到“你得到了私有值”:但是程序拋出了一個異常:

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

所以,我想檢索私有字段“value”,而不修改“MyClass”和“AnotherClass”,並且不直接在 main() 中從 AnotherClass 調用公共構造函數。 我想從“obj”中獲取值。

更改此行

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

對此

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

get 方法需要 object 來訪問字段(除非它是 static 字段)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM