我在第 3 方有一个设计不佳的课程,JAR我需要访问它的一个 私有 字段。例如,为什么我需要选择私有字段是否有必要?
JAR
class IWasDesignedPoorly { private Hashtable stuffIWant; } IWasDesignedPoorly obj = ...;
如何使用反射来获取 的值stuffIWant?
stuffIWant
为了访问私有字段,您需要从类的 声明 字段中获取它们,然后使其可访问:
Field f = obj.getClass().getDeclaredField("stuffIWant"); //NoSuchFieldException f.setAccessible(true); Hashtable iWantThis = (Hashtable) f.get(obj); //IllegalAccessException
编辑 :正如 aperkins 所评论的那样,访问该字段,将其设置为可访问并检索该值都可以 throw Exceptions,尽管您需要注意的唯一 检查异常在上面进行了评论。
Exception
NoSuchFieldException如果您要求一个名称与声明的字段不对应的字段,则会抛出该字段。
NoSuchFieldException
obj.getClass().getDeclaredField("misspelled"); //will throw NoSuchFieldException
如果该字段不可访问(例如,如果它是私有的并且由于错过了该行IllegalAccessException而无法访问),则会抛出。f.setAccessible(true)
IllegalAccessException
f.setAccessible(true)
RuntimeException可能抛出的 s 是s SecurityException(如果 JVMSecurityManager不允许您更改字段的可访问性),或者IllegalArgumentException是 s,如果您尝试访问不是字段类类型的对象上的字段:
RuntimeException
SecurityException
SecurityManager
IllegalArgumentException
f.get("BOB"); //will throw IllegalArgumentException, as String is of the wrong type