[英]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.