java - 使用反射获取私有(private)非原始字段的值

标签 java reflection

假设我们有两个不同的包...其中一个包无法访问,但我们想知道名为 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/

相关文章:

java - java中如何终止正在运行的循环?

java - 如何启动具有无限内存的 JVM?

java - 使用java api客户端进行elasticsearch身份验证

java - 如何为类似 ResultSet 的 API 实现通用包装器?

java - java反射可以将不在java源文件中的方法添加到类文件中吗?

java - 有没有办法在没有显式转换的情况下完成这项工作? (尝试通用父子关系)

java - import在gradle项目中用红色下划线

scala - 使用递归类型的基本 Scala 反射代码无法编译。为什么 ?如何解决?

c# - 如何获取通用扩展方法的 MethodInfo?

java - 如何用 guice 替换反射?