簡體   English   中英

我正在嘗試通過反射訪問私有成員變量,但得到 java.lang.NoSuchFieldException

[英]I am trying to access a private member variable through reflection but getting java.lang.NoSuchFieldException

public class AccessPrivateMember {
    private String privateName;

    public AccessPrivateMember(String privateName) {
        super();
        this.privateName = privateName;
    }

    public String getPrivateName() {
        return privateName;
    }

    public void setPrivateName(String privateName) {
        this.privateName = privateName;
    }
    public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {

        AccessPrivateMember objAccessPrivateMember = new AccessPrivateMember("Secret Name");
        /*
         * Field reflectionAPIField=
         * objAccessPrivateMember.getClass().getDeclaredField("privateName"); String
         * secretName = (String) reflectionAPIField.get(objAccessPrivateMember);
         * System.out.println("secretName="+secretName);
         */
        Field reflectionAPIField2= AccessPrivateMember.class.getClass().getDeclaredField("privateName");
        reflectionAPIField2.setAccessible(true);        
        String secretName2ndWay = (String) reflectionAPIField2.get(objAccessPrivateMember);
        System.out.println("secretName2ndWay="+secretName2ndWay);
    }

}

例外

Exception in thread "main" java.lang.NoSuchFieldException: privateName
    at java.lang.Class.getDeclaredField(Unknown Source)
    at io.java.interview.AccessPrivateMember.main(AccessPrivateMember.java:31)
  1. 第 31 行是

    Field reflectionAPIField2 = AccessPrivateMember.class.getClass().getDeclaredField("privateName");
  2. 注釋的代碼正在打印正確的結果,並且它還通過 privateName 訪問私有實例變量。 但是第 31 行給出了上述錯誤。

他,歡迎來到 Stackoverflow。

以下行不正確:

  Field reflectionAPIField2= AccessPrivateMember.class.getClass().getDeclaredField("privateName");
reflectionAPIField2.setAccessible(true);        

將此更改為

   Field reflectionAPIField2= AccessPrivateMember.class.getDeclaredField("privateName");
reflectionAPIField2.setAccessible(true); 

如此所述

如果 object 的實例可用,那么獲取其 Class 的最簡單方法是調用 Object.getClass()。

在您的代碼中Field reflectionAPIField2= AccessPrivateMember.class不是一個實例,因此它不起作用。

只需將您的第 31 行更改為

Field reflectionAPIField2 = AccessPrivateMember.class.getDeclaredField("privateName");

暫無
暫無

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

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