现代JVM中的反思成本(6级以上)

Ana*_*lya 5 java reflection

我想知道现代JVM中反射的成本是否下降,除了代码中最关键的部分外,我们可以在任何地方自由使用它.

例如,如果我想基于用户给出的方法名称作为输入调用方法.现在有两种方法可以实现这个:

  1. 使用if/else /开关确定要调用的方法.如果存在大量案例,这显然会是很多代码.

  2. 使用反射来调用方法.这绝对是更少的代码.

澄清:上面只是一个使用反射可以缩短代码量的示例.我只是想知道用一些反射魔法替换大量静态代码是否是一种有效的策略.如果您在类似的路线上做过某些事情,也可以分享任何经验.

duf*_*ymo 4

不,在我看来,还有另一种更好的方法:使用命令模式和名称/命令实例对的映射。您可以在没有开关或反射的情况下将其扩展很长一段距离。它也是多态的——更加“面向对象”。

如果您不想使用自己的命令,请查看java.lang.Runnable或。java.util.concurrent.Callable如果您愿意,您的方法可以异步执行。

我不清楚用户如何指定他们希望调用哪个方法。如果使用反射,他们必须拼出类的名称、方法、参数,并知道返回类型。您打算如何向他们展示可能的选择?应用程序中的每个类、每个方法?有什么公平的游戏吗?

我认为提供一个以易于指定和调用的方式规定的选择列表要合理得多。我不认为任何基于反射的解决方案都符合该标准。

你想为用户提供一个选择,但“一切皆有可能”对我来说似乎并不实际。

至于下面提供的具体示例,其中包括 Spring 控制器和服务,我不会使用反射。如果您的用户通过传递 HTTP 查询参数来指定启动或停止,最好使用 REST 将各个控制器方法映射到您想要的特定 URL。我的偏好是清晰,即使它更冗长。