当前位置: 首页 > 面试题库 >

如何从Java中的其他类读取私有字段的值?

孟财
2023-03-14
问题内容

我在第3方中设计的课程很差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所说,访问字段,将字段设置为可访问并检索值都可能引发Exceptions,尽管上面需要注释的唯一检查异常。

在NoSuchFieldException如果你问一个字段由不符合声明的字段的名称将被抛出。

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

IllegalAccessException会如果字段是不可访问(被抛出例如,如果是私人和通过失踪了尚未作出访问f.setAccessible(true)线。

RuntimeException可抛出s为要么SecurityExceptionS(如果JVM的SecurityManager将不允许你改变一个字段的可访问性),或IllegalArgumentExceptionS,如果你尝试接入领域的对象不是字段的类的类型上:

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


 类似资料:
  • 问题内容: 我有以下课程 你好 嗨.java CustomMap.java 直到我从中删除访问说明符之前,这都可以正常工作 编译器大喊 类型speak.hi.CustomMap不 可见 现在,如果我没有修改的选项(第三方jar等),还有什么我可以使用的方法吗? 我知道的一个选项是转到,因为Hello已在程序包中,它可以访问程序包私有类。 还有其他方法吗?也许使用反射? 编辑 :按@StephenC

  • 问题内容: 我希望我说的是我的话。我有这样的课: 和其他这样的类: 这是从其他类(在该示例代码中)访问和更改其值的正确方法吗,是否有更好或更合适的解决方案?请注意,这是具有方法的类。 问题答案: 从另一个类访问私有变量的正确方法是使用getter和setter方法。否则,您应该将该变量公开。 那是: 但是,直接返回私有数据是一种不好的做法- 允许外部代码修改您的私有状态。通常,您应该返回私有数据的

  • 问题内容: 我有一个包含多个Maven模块的项目 MockIFSClient 访问为 因此 IFSClientTest 运行鳍,因为它们在同一包中。 问题? 尝试访问相同代码的 调用,但现在失败,因为 services / pom.xml 具有以下依赖性 题 我要做出什么改变 这样也可以从不同的模块访问它 问题答案: 这个答案帮助我正确了 如何从Java中的类路径真正读取文本文件 我将代码更改为

  • 我有一个主要的场景,在那里我保留了所有的木鬼。它有一个菜单,打开新的场景,在那里我有一些设置: 这个eventLog文本区是我放置所有日志的地方,比如应用程序启动、设置更改、项目保存等。我正在用openProjectWindow void打开新场景,并且我正在将这些信息添加到我的日志记录程序中。我的新窗口是一个单独的类: 完成后,我需要访问StartController.EventLog,但我尝试

  • 问题内容: 我正在做大学项目。 我需要从课堂上获取所有字段。甚至是私有的并继承的。我试图获取所有声明的字段,然后转换为超类并重复。我的代码片段: 但这行不通。强制转换后仍然是同一类(不是超类)。 我将感谢您提供任何有关如何解决铸造问题或如何以其他方式检索这些字段的帮助。 问题不是要访问字段,而是要获取字段名称! 我以这种方式进行管理: 问题答案: obj = obj.getClass().getS

  • 我在Android开发者网站http://developer.Android.com/training/animation/screen-slide.html上学习这个教程 我的情况是...