假设我们有两个不同的包...其中一个包无法访问,但我们想知道名为 b 的复杂字段的值。
public class A {
private String whatever;
private B b;
private static class B {
final ArrayList<Z> c = new ArrayList<Z>();
private void addItem(Z z) {
this.c.add(z);
}
private Z getItem(int nr) {
return this.c.get(nr);
}
}
}
public class Reflect extends A {
public static void main(String[] args) throws NoSuchFieldException, SecurityException {
Reflect ref = new Reflect();
Class getA = ref.getClass().getSuperclass();
Field getB = getDeclaredField("b");
getB.setAccessible(true);
Class bInst = getB.getClass();
Method bMeth = bInst.getMethod("getItem", Integer.TYPE);
Object zInst = bMeth.invoke(new Integer(123));
}
}
如果没有从包中获取复杂类型B,如何获取值? 即使我将字段 gstB 设置为可访问,仍然会出现 java.lang.NoSuchMethodException: stackOver.A.getItem(int) ....
最佳答案
您唯一缺少的是 getField 只为您提供公共(public)可访问字段。
Field getB = getA.getDeclaredField("b");
将为您提供该类的任何字段。
<小时/>更长的例子
class Main {
public static class A {
private String whatever;
private B b = new B();
private static class B {
final ArrayList<String> c = new ArrayList<String>();
private void addItem(String z) {
this.c.add(z);
}
private String getItem(int nr) {
return this.c.get(nr);
}
}
}
public static class Reflect extends A {
public static void main(String... ignored) throws Exception {
Reflect ref = new Reflect();
Class getA = ref.getClass().getSuperclass();
Field getB = getA.getDeclaredField("b");
getB.setAccessible(true);
Object b = getB.get(ref);
Method addItem = b.getClass().getDeclaredMethod("addItem", String.class);
addItem.setAccessible(true);
addItem.invoke(b, "Hello");
Method getItem = b.getClass().getDeclaredMethod("getItem", int.class);
getItem.setAccessible(true);
String hi = (String) getItem.invoke(b, 0);
System.out.println(hi);
}
}
}
打印
Hello
关于java - 使用反射获取私有(private)非原始字段的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14549821/