Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
反思Java_Java_Reflection - Fatal编程技术网

反思Java

反思Java,java,reflection,Java,Reflection,我只是错失了一个机会,没有回答两个问题。我仍然不知道答案,因此正在寻找答案: [1] 您有一个带有私有变量且没有getter/setter方法的Java类。如何修改这些变量 我的回答是:你不能这样做,私有变量不能从外部访问。 采访者:正确答案是“运用反思” [2] 您使用哪些反射方法来执行上述操作? 我的回答是:我不确定。 记者:再见 根据我的经验,我会(1)检查类是否存在(2)创建实例(3)检查方法是否存在(4)调用方法(5)继续处理类的实例。当然,我会捕获诸如ClassNotFound和Me

我只是错失了一个机会,没有回答两个问题。我仍然不知道答案,因此正在寻找答案:

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

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

[2] 您使用哪些反射方法来执行上述操作? 我的回答是:我不确定。 记者:再见

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

鉴于此:

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

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

为了使字段可访问,您必须调用


这是一个我脑子里不知道的话题,如果我使用它/什么时候使用它(我不记得上次使用它是什么时候)。对于一个面试官来说,对这个问题如此关注似乎有点不寻常。

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

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

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

所以,你看,这个问题不够好,没有上下文,它就没有意义。根据你得到的细节,也许这个问题的答案应该是另一个问题,如:

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

这个答案会让面试官给你更多的背景知识,然后你就能给出合适的答案。例如,现在面试官可能会说该类是第三方框架的一部分,而您没有该类的源代码,因此不可能提供getter/setter方法,但您必须读取/写入该框架给定对象的某个私有状态,作为解决某个问题的变通方法


现在,您将有更多的上下文,您可以问另一个问题,比如:您在这个应用程序上使用安全管理器吗?如果他/她说不,那么你可以说,在这种情况下,反射是一种选择……

人们对持久性框架(如Hibernate)这样做。这已经在这里被问到了,并且回答了好几次。面试官正在检查你是否了解反射。不过,他没有使用最合适的问题:尽管通过反射API和使用
setAccessible
访问私有变量是绝对可能的,这肯定是一个糟糕的做法。我认为,如果他们认为反射api的先验知识是必须具备的,那么你应该很高兴摆脱了他们。@BrianAgnew我完全同意。不过,这也不是第一次有人使用某种未使用/误用的技术或技术来筛选申请人。。。如果这不是反射,那就是另一种超特殊的半遗忘的方法。。。这很可悲。最后,这是他们的损失,因为伟大的头脑逃到了其他地方。作为一个滑稽的注释,我会说“看,我对坏的或可疑的行为一无所知!”回答得很好。我只想简单地补充一下,您可以使用Class.getDeclaredFields()`方法获取所有字段(有一个名为
Class
)的类)。