使用 groovy 对象而不是使用 java 反射是好的选择吗

Is it good option to use groovy objects rather than using java reflection

在java反射中,我们一般会尝试通过字段的属性名来获取运行时的字段值。但是考虑到性能影响,不推荐使用反射。

但在这种情况下,我们可以使用 groovy 允许通过属性名称检索值的对象

例如:

Person.groovy

Class Person { String name }

MainApp.java

Class MainApp { 
       public static void main(String[] args) { 
             Person p = new Person(); 
             p."name"="jonh";
       }
}

这会和反射有同样的性能吗?

许多动态 groovy 功能将使用反射或类似的东西,导致性能低于静态编译代码。在某些情况下 Groovy 代码甚至可以使用内部抛出和捕获的异常。来自 Cédric Champeau's blog:

[...] someone made a terrible design decision in Groovy. [...] the idea was to rely on exceptions to control the flow of resolution of properties. This means that when a property is missing, typically in a closure, an exception is thrown. When a method is not found, an exception is thrown. When a property is not found, an exception is thrown. That seemed to be a good idea, because in the end, you want to provide the user with an error, but in practice, this is catastrophic, because Groovy can capture those exceptions. [...] And that has a terrible impact on performance. [...] So, if you’re writing a plugin in Groovy, for the sake of performance, please add @CompileStatic.

但是通过使用 Groovy,您已经在 很多 地方接受了这种性能影响,所以这个问题似乎毫无意义。如果您担心这种微性能问题,Groovy 通常是错误的语言。

请注意,通过在所有 classes 上使用 @CompileStatic,您可能可以为自己的代码避免此类性能问题(但动态功能不会编译/表现不同),但对于您依赖的任何 groovy SDK 或 groovy 库 class 来说,情况仍然如此。

关于字段访问

在您的示例中,如果您使用常量字符串,编译器可能会将其优化为 p.name

是否支持可能取决于 Groovy 版本(未来版本处理此问题的方式可能与当前版本不同)。