簡體   English   中英

如何使用Java訪問另一個類的私有字段中的私有字段

[英]How to access a private field in a private field in another class using Java

我很清楚可以通過使用Reflection輕松地訪問Java中的私有字段。 如帖子中所示: 如何從Java中的其他類讀取私有字段的值? 還有很多

為此,關鍵的一步是設置可訪問性。

Field f = obj.getClass().getDeclaredField("aaa"); 
f.setAccessible(true);

但就我而言,情況是這樣的:

class A{
 private B b;

 class B{
   private String value;
 }
}

我想在另一個類中獲取絕對值的值。 當我嘗試時,我打算這樣做

A obj = createInstanceA();
Field f = obj.getClass().getDeclaredField("b"); 
f.setAccessible(true);
A.B b = f.get(obj);
Field f2 = b.getClass().getDeclaredField("value");
f2.setAccessible(true);
String value = f2.get(b);

哪個不能解決,因為無法從A聲明B。如果不能修改A類,我還有其他選擇嗎?

你是這樣的

public class A {
    private B b = new B();

    class B {
        private String value = "String";
    }
}

public class ClassB {
    public static void main(String args[]) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
        A obj = new A();
        Field f = obj.getClass().getDeclaredField("b"); 
        f.setAccessible(true);
        A.B b = (B) f.get(obj);
        Field f2 = b.getClass().getDeclaredField("value");
        f2.setAccessible(true);
        String value = (String) f2.get(b);
        System.out.println(value);
    }
}

您缺少的是將setAccessible(true)設置為內部類字段。

首先,在您的示例字段中,b為空。 它是否正確? 因此,您嘗試獲取null類。

第二,在您的示例中,您使用內部類,並且有一個特定的語言機制。 您只能通過類A的某些實例來創建類B的實例。類B的所有實例都可以訪問其父級(類A)的私有字段。 如本例所示。

class OuterClass 
{  
    // static member 
    static int outer_x = 10; 

    // instance(non-static) member 
    int outer_y = 20; 

    // private member 
    private int outer_private = 30; 

    // inner class 
    class InnerClass 
    { 
        void display() 
        { 
            // can access static member of outer class 
            System.out.println("outer_x = " + outer_x); 

            // can also access non-static member of outer class 
            System.out.println("outer_y = " + outer_y); 

            // can also access private member of outer class 
            System.out.println("outer_private = " + outer_private); 

        } 
    } 
} 

// Driver class 
public class InnerClassDemo 
{ 
    public static void main(String[] args) 
    { 
        // accessing an inner class 
        OuterClass outerObject = new OuterClass(); 
        OuterClass.InnerClass innerObject = outerObject.new InnerClass(); 

        innerObject.display(); 

    } 
} 

也許內部類可以解決您的問題? (您可以在這里閱讀https://www.geeksforgeeks.org/nested-classes-java/ )。然后,不需要reflecsoin。

暫無
暫無

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

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