Java通过反射访问私有(private)属性

标签 java reflection

我有以下包结构和类。

package  X 
    Class A
        private string fieldX;
        protected string getFieldX(){ return fieldX};

package Y
    Class B extends A
    Class C extends B

我有 ClassC 对象并试图通过反射获取 fieldX。

Class partypes[] = new Class[0];
Object arglist[] = new Object[0];
Method getContextMethod = ClassC.class.getMethod("getFieldX",partypes);
String retValue =  (string) getContextMethod.invoke(classCInstance, arglist);

但我收到 NoSuchMethod 异常。

我也试过直接到达 fieldX。但是这次我得到了 NoSuchField 异常。

Field reqField = ClassC.class.getDeclaredField("fieldX");
reqField.setAccessible(true);
Object value = reqField.get(classCInstance);
String retValue =  (string) value;

我做错了什么? 有没有办法从 ClassC 对象中获取这个 fieldX?

解决方案:(非常感谢vz0的解决方案);

直接访问私有(private)字段:

Field reqField = ClassA.class.getDeclaredField("fieldX");
reqField.setAccessible(true);
String value = (String)reqField.get(clazzc);

方法调用;

Class partypes[] = new Class[0];
Object arglist[] = new Object[0];
Method getContextMethod = ClassA.class.getDeclaredMethod("getFieldX",partypes);
getContextMethod.setAccessible(true);
System.out.println((String)getContextMethod.invoke(clazzc, arglist));

最佳答案

Class.getMethod 调用仅用于公共(public)方法。您需要使用 Class.getDeclaredMethod 调用,然后将 Method.setAccessible 属性设置为 true:

Class partypes[] = new Class[0];
Object arglist[] = new Object[0];
Method getContextMethod = ClassA.class.getDeclaredMethod("getFieldX",partypes);

getContextMethod.setAccessible(true);

String retValue =  (string) getContextMethod.invoke(classCInstance, arglist);

编辑:由于 getFieldX 方法是在 ClassA 上声明的,因此您需要从 ClassA 而不是 ClassC 获取方法。与 getMethod 调用相反,getDeclaredMethod 调用 ignores superclasses .

关于Java通过反射访问私有(private)属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4935136/

相关文章:

java - CXF JAXRS - 如何 POST 多个参数

c# - PropertyInfo.SetValue() 不工作但没有错误

java - Android Studio "Unfortunately the Application had to stop"错误。

java - 空指针异常(Java)

java - Elasticsearch postfiler 取消过滤器

java - 处理长时间运行的清理逻辑以响应 Netty ChannelInactive 事件的正确方法?

xml - 如何从同一程序集的多个版本配置 Unity?

java - 关于 MethodHandle API 的一些基本问题

java - 您可以在 GWT 客户端中使用 Java Reflection api吗

reflection - 获得反射。结构类型