我刚刚错过了一个机会,没能回答两个问题。我仍然不知道答案,所以寻找它们:
[1]你有一个带有私有变量的Java类,没有getter/setter方法。如何修改这些变量?
我的回答:你不能这样做,私有变量不能从外部访问。采访者:正确答案是"使用反射"。
[2]您使用哪些反射方法来完成上述操作?我的回答是:我不确定。面试官:再见。
根据我的经验,我会(1)检查类是否存在(2)创建实例(3)检查方法是否存在(4)调用方法(5)继续使用类的实例。当然,我会捕捉像ClassNotFound和MethodInvocation这样的异常。但是有什么技巧可以修改私有变量吗?人们会这样做吗?TIA。
鉴于此:
你有一个带有私有变量的Java类,没有getter/setter方法。如何修改这些变量?
我的回答是,你不需要特定的setter/getter,你只需要在其他非特定方法中修改它们。在许多情况下,可以将setter/getter视为暴露实现。
为了使一个字段可访问,你必须调用field . setaccessible()。
这是一种我不知道的话题,如果/当我使用它时,我必须查找它(我不记得我最后一次使用它是什么时候)。面试官对这个问题如此耿耿于心似乎有点不寻常。
好吧,即使一个类没有getter和set,也不意味着这个类中没有其他方法可以修改它的状态。毕竟,如果他们在课堂上,是因为课堂需要他们完成任何类型的任务。因此,很有可能其他方法可以修改类的状态,作为它们职责的一部分。
例如,如果你的类是一个银行帐户类,可能没有直接设置帐户余额的方法,但可能有接受诸如取款或存款之类的交易的方法,这些方法最终会在内部修改类的状态。
所以这从一开始就是一个糟糕的问题,因为没有足够的背景就很难回答。反射可能是一个选项,但如果您使用的是安全管理器,那么可能会阻止反射修改私有字段,因此这也可能是一个错误的答案。
所以,你看,这个问题不够好,没有上下文就没有意义。根据你得到的细节,也许这个问题的答案应该是另一个问题,如:
为什么要修改类的私有字段?毕竟它们是私密的是有原因的。所以,基本上,如果你发现你需要改变它们,你需要做的是坐下来重新考虑你的设计,并确定你的类是否没有适当的公共接口。
这个答案可以让面试官给你更多的背景信息,然后你就可以给出合适的答案。例如,现在面试官可能会说这个类是第三方框架的一部分,而你没有它的源代码,所以不可能提供getter/setter方法,但你被迫读/写这个框架中给定对象的一些私有状态,作为解决某些问题的变通办法。现在,您将有更多的上下文,您可以问另一个问题,如:您是否在此应用程序上使用安全管理器?如果他/她说不,那么你可以说,在这种情况下,反射是一个选项.....