5

我只是搞砸了一个机会,未能回答 2 个问题。我仍然不知道答案,所以寻找他们:

[1] 您有一个带有私有变量且没有 getter/setter 方法的 Java 类。你如何修改这些变量?

我的回答:你不能这样做,不能从外部访问私有变量。采访者:正确答案是“使用反射”。

[2] 您使用哪些反射方法来完成上述操作?我的回答:我不确定。采访者:再见。

根据我的经验,我会(1)检查类是否存在(2)创建实例(3)检查方法是否存在(4)调用方法(5)继续类的实例。当然,我会捕获 ClassNotFound 和 MethodInvocation 之类的异常。但是有修改私有变量的技巧吗?人们会这样做吗?TIA。

4

2 回答 2

2

鉴于这种:

您有一个带有私有变量且没有 getter/setter 方法的 Java 类。你如何修改这些变量?

我的回答是您不需要特定的 setter/getter,您只需在其他非特定方法中修改它们。在许多情况下,可以将 Setter/getter 视为公开实现。

为了使字段可访问,您必须调用Field.setAccessible()

这是我不知道的那种话题,并且必须在我使用它时/何时查找(我不记得上次使用它是什么时候)。对于一个面试官来说,如此挂断这件事似乎有点不寻常。

于 2013-03-08T15:01:34.870 回答
1

好吧,即使一个类没有 getter 和 setts,也不意味着该类中没有其他方法可以修改其状态。毕竟,如果他们在课堂上是因为课堂需要他们执行任何类型的任务。因此,其他方法可能会修改类的状态作为其职责的一部分。

例如,如果您的类是银行账户类,可能没有直接设置账户余额的方法,但可能有一些方法可以接受诸如取款或存款之类的交易,最终会在内部修改该类的状态。

所以从一开始这确实是一个糟糕的问题,因为没有足够的上下文,答案很困难。反射可能是一种选择,但如果您使用的是安全管理器,则可能会阻止反射修改私有字段,因此这也可能是一个错误的答案。

所以,你看,这个问题还不够好,没有上下文就没有意义。根据您获得的详细信息,也许该问题的答案应该是另一个问题,例如:

为什么要修改类的私有字段?毕竟他们是私人的,这是有原因的。所以,基本上如果你发现你需要改变它们,你需要做的就是坐下来重新考虑你的设计并确定你的类是否没有正确的公共接口。

该答案可能会导致面试官为您提供更多背景信息,然后您可以提供适当的答案。例如,现在面试官可能会说这个类是第三方框架的一部分,而你没有它的源代码,所以不可能提供 getter/setter 方法,但你不得不读/写一些此框架的给定对象的私有状态作为解决某些问题的解决方法。

现在,您将拥有更多上下文,您可以提出另一个问题,例如:您是否在此应用程序上使用安全管理器?如果他/她说不,那么您可以说,在这种情况下,反思是一种选择......

于 2013-03-08T15:05:32.843 回答