反思Java

时间:2013-03-08 14:59:23

标签: java reflection

我搞砸了一个机会,没有回答2个问题。我仍然不知道答案,所以找他们:

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

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

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

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

2 个答案:

答案 0 :(得分:3)

鉴于此:

  

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

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

要使字段可访问,您必须致电Field.setAccessible()

这是我不知道的那种主题,并且必须查看我是否/何时使用它(我不记得何时我上次使用它) 。如果面试官如此挂起,这似乎有点不寻常。

答案 1 :(得分:1)

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

例如,如果您的班级是银行帐户类,可能没有方法可以直接设置帐户余额,但也许有些方法可以接受提款或存款等最终会修改班级状态的交易内部。

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

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

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

这个答案可以让面试官给你更多的背景,然后你可以提供适当的答案。例如,现在访谈者可以说该类是第三方框架的一部分,并且您没有它的源代码,因此不可能提供getter / setter方法但是您被迫阅读/写了一些此框架的给定对象的私有状态作为解决某些问题的解决方法。

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