java - 如何从 Java 中的不同类读取私有(private)字段的值?

标签 java class reflection field private

我在第 3 方 JAR 中有一个设计不佳的类,我需要访问它的 private 字段之一。例如, 为什么我需要选择私有(private)字段是否有必要?

class IWasDesignedPoorly {
    private Hashtable stuffIWant;
}

IWasDesignedPoorly obj = ...;

如何使用反射获取stuffIWant的值?

最佳答案

为了访问私有(private)字段,您需要从类的声明的字段中获取它们,然后使其可访问:

Field f = obj.getClass().getDeclaredField("stuffIWant"); //NoSuchFieldException
f.setAccessible(true);
Hashtable iWantThis = (Hashtable) f.get(obj); //IllegalAccessException

编辑:正如 aperkins 所评论的,访问字段、将其设置为可访问和检索值都可能抛出 Exception s,尽管上面评论了您需要注意的唯一已检查异常。

NoSuchFieldException如果您要求一个名称与声明的字段不对应的字段,则会抛出。

obj.getClass().getDeclaredField("misspelled"); //will throw NoSuchFieldException

IllegalAccessException如果该字段不可访问(例如,如果它是私有(private)的并且由于遗漏了 f.setAccessible(true) 行而无法访问),将被抛出。

RuntimeException可能抛出的 s 是 SecurityException s(如果 JVM 的 SecurityManager 不允许您更改字段的可访问性),或 IllegalArgumentException s,如果您尝试访问不是字段类类型的对象上的字段:

f.get("BOB"); //will throw IllegalArgumentException, as String is of the wrong type

关于java - 如何从 Java 中的不同类读取私有(private)字段的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1196192/

相关文章:

java - DAO 可以用于多个表吗?

java - 这是使用 Enum 的正确方法吗?

python - 如何创建一个具有大量属性而不重复代码的类?

c# - Java通过反射创建通用Arraylist

调用私有(private)方法时出现 Java InvokingTargetException

java - 如何从方法返回接口(interface)

java - 为什么这个程序的空间复杂度是O(h)?其中 h 是 btree 的高度

java - java中的内存使用/引用

java - 动态调用方法

java - JLayeredPane 组件旁边的白色背景