我在第三方JAR中有一个设计糟糕的类,我需要访问它的private个字段之一.例如

class IWasDesignedPoorly {
    private Hashtable stuffIWant;
}

IWasDesignedPoorly obj = ...;

如何使用反射获得stuffIWant的值?

推荐答案

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

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

EDIT:正如aperkins所 comments 的那样,访问字段、将其设置为可访问以及检索值都会抛出Exception秒,尽管上面只对checked个需要注意的异常进行了 comments .

如果您请求的字段的名称与声明的字段不对应,则会抛出NoSuchFieldException.

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

如果该字段不可访问(例如,如果它是私有的,并且没有通过错过f.setAccessible(true)行来访问),则会抛出IllegalAccessException.

如果JVM的SecurityManager不允许您更改字段的可访问性,则可能抛出的RuntimeExceptionSecurityException,如果您try 在非字段类类型的对象上访问字段,则抛出的RuntimeExceptionIllegalArgumentException:

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

Java相关问答推荐

Java小程序未在MacOS上运行

如何从片段请求数据到活动?在主要活动中单击按钮请求数据?

如何在Spring Boot中创建500错误的响应正文?

为什么一个java函数会返回一个作为参数传递给它的对象?

Intellij显示项目语言级别最高为12,尽管有java版本17 SDK

无法使用ApacheSpark依赖项构建JavaFX应用程序

在JDK 1.8源代码中,为什么使用A-B 0来确定哪个更大,而不是A B?

在Eclipse中数组的可空性

为什么我的回收视图会显示重复的列表?

在执行流和相关操作时,使用Java泛型为2个方法执行相同的操作,但对象不同

如何在JavaFX中制作鼠标透明stage

Java Telnet客户端重复的IAC符号

如何获得凌空cookies ,并设置它在下一个请求- android

如何在不作为类出现的表上执行原生查询?

为什么我不能建立输入/输出流?Java ServerSocket

我该如何为我的类编写getter和setter方法?

在权限列表中找不到我的应用程序

整数->;双取消框,但双->;int不';t开箱.为什么?

如何在特定关键字后提取与模式匹配的多个值?

spring 更新多项管理关系