如何在Java中从不同的类中读取私有字段的值?
2022-08-31 04:20:26
我在第三方中有一个设计不佳的班级,我需要访问其中一个私人领域。例如,为什么我需要选择私有字段是必要的?JAR
class IWasDesignedPoorly {
private Hashtable stuffIWant;
}
IWasDesignedPoorly obj = ...;
如何使用反射来获取 ?stuffIWant
我在第三方中有一个设计不佳的班级,我需要访问其中一个私人领域。例如,为什么我需要选择私有字段是必要的?JAR
class IWasDesignedPoorly {
private Hashtable stuffIWant;
}
IWasDesignedPoorly obj = ...;
如何使用反射来获取 ?stuffIWant
为了访问私有字段,您需要从类的声明字段中获取它们,然后使它们可访问:
Field f = obj.getClass().getDeclaredField("stuffIWant"); //NoSuchFieldException
f.setAccessible(true);
Hashtable iWantThis = (Hashtable) f.get(obj); //IllegalAccessException
编辑:正如aperkins所评论的那样,访问字段,将其设置为可访问和检索值都可以抛出s,尽管您需要注意的唯一检查异常在上面进行了注释。Exception
如果您要求字段的名称与声明的字段不对应,则会抛出 。NoSuchFieldException
obj.getClass().getDeclaredField("misspelled"); //will throw NoSuchFieldException
如果字段不可访问(例如,如果该字段是私有的,并且尚未通过缺少该行而使其可访问),则会抛出 。IllegalAccessException
f.setAccessible(true)
可能抛出的 s 要么是 s(如果 JVM 不允许您更改字段的可访问性),要么是 s,如果您尝试访问不是字段类类型的对象上的字段:RuntimeException
SecurityException
SecurityManager
IllegalArgumentException
f.get("BOB"); //will throw IllegalArgumentException, as String is of the wrong type
从 Apache commons-lang3 尝试 FieldUtils
:
FieldUtils.readField(object, fieldName, true);
附言:在我看来,反思是邪恶的。