我刚刚搞砸了一个机会,没有回答两个问题。我仍然不知道答案,所以寻找它们:
1您有一个带有私有变量但没有getter/setter方法的Java类。如何修改这些变量?
我的回答是:你不能这样做,私有变量不能从外部访问。记者:正确的答案是“使用反射”。
2您使用哪些反射方法来执行上述操作?我的回答是:我不确定。记者:再见。
根据我的经验,我会(1)检查类是否存在(2)创建一个实例(3)检查方法是否存在(4)调用方法(5)继续执行类的实例。当然,我会捕获像ClassNotFound和MethodInvocation这样的异常。但是有没有修改私有变量的诀窍呢?人们会这样做吗?蒂娅。
发布于 2013-03-08 23:01:35
考虑到这一点:
你有一个带有私有变量但没有getter/setter方法的Java类。如何修改这些变量?
我的回答是,您不需要特定的setter/getter,只需在其他非特定的方法中修改它们。Setters/getter在很多情况下都可以看作是暴露了实现。
为了使字段可访问,您必须调用Field.setAccessible()。
这是一种我根本不知道的话题,如果我使用它,我必须查找它(我不记得我最后一次使用它是什么时候)。对于一个面试官来说,对此如此着迷似乎有点不寻常。
发布于 2013-03-08 23:05:33
好吧,即使一个类没有getter和setts,这并不意味着类中没有其他方法可以修改它的状态。毕竟,如果他们在班上,是因为班级需要他们来执行任何类型的任务。因此,其他方法可能会修改类的状态,作为其职责的一部分。
例如,如果您的类是一个银行帐户类,可能没有直接设置帐户余额的方法,但可能有接受诸如取款或存款等事务的方法,这些事务最终会在内部修改类的状态。
因此,这从一开始就是一个糟糕的问题,因为如果没有足够的上下文,答案是困难的。反射可能是一种选择,但如果您使用的是安全管理器,这可能会阻止反射修改私有字段,因此这也可能是一个错误的答案。
所以,你看,这个问题不够好,没有上下文它就没有意义。根据你得到的详细信息,也许这个问题的答案应该是另一个问题,比如:
为什么要修改类的私有字段?毕竟,它们是私人的,这是有原因的。因此,基本上,如果你发现你需要改变它们,你需要做的是坐下来重新考虑你的设计,并确定你的类是否没有合适的公共接口。
这个答案可能会让面试官给你更多的上下文,然后你就可以提供适当的答案。例如,现在面试官可能会说这个类是第三方框架的一部分,而您没有它的源代码,所以不可能提供getters/setter方法,但是您被迫读取/写入这个框架的给定对象的一些私有状态作为解决方法来解决一些问题。
现在,您将有更多的上下文,您可以问另一个问题,例如:您是否在此应用程序上使用安全管理器?如果他/她说不,那么你可以说,在这种情况下,反射是一种选择……
https://stackoverflow.com/questions/15296899
复制相似问题