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

2022-08-31 04:20:26

我在第三方中有一个设计不佳的班级,我需要访问其中一个私人领域。例如,为什么我需要选择私有字段是必要的?JAR

class IWasDesignedPoorly {
    private Hashtable stuffIWant;
}

IWasDesignedPoorly obj = ...;

如何使用反射来获取 ?stuffIWant


答案 1

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

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

如果字段不可访问(例如,如果该字段是私有的,并且尚未通过缺少该行而使其可访问),则会抛出 。IllegalAccessExceptionf.setAccessible(true)

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

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

答案 2

从 Apache commons-lang3 尝试 FieldUtils

FieldUtils.readField(object, fieldName, true);

附言:在我看来,反思是邪恶的