小编典典

如何从 Java 中的不同类读取私有字段的值?

all

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

class IWasDesignedPoorly {
    private Hashtable stuffIWant;
}

IWasDesignedPoorly obj = ...;

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


阅读 146

收藏
2022-03-10

共1个答案

小编典典

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

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

编辑 :正如 aperkins 所评论的那样,访问该字段,将其设置为可访问并检索该值都可以 throw
Exceptions,尽管您需要注意的唯一 检查异常在上面进行了评论。

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

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

如果该字段不可访问(例如,如果它是私有的并且由于错过了该行IllegalAccessException而无法访问),则会抛出。f.setAccessible(true)

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

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