我在第 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/