Java 龙目山会降低性能吗?

Java 龙目山会降低性能吗?,java,performance,lombok,Java,Performance,Lombok,我真的很喜欢lombok项目摆脱样板代码的特性。 我的大四学生建议我,lombok似乎使用反射来减少样板代码,我曾经听说使用反射会影响性能。 我的问题是使用ProjectLombok有什么问题吗?lombok在运行时不使用反射。它钩住编译器内部并在编译时向类添加代码,然后正常编译。@chrylis的答案是正确的,但要注意对象图(@Data和@ToString注释)例如 Lombok将创建内部具有无限递归的toString。你应该使用 类似于类B中的@ToString(exclude={“a”})

我真的很喜欢lombok项目摆脱样板代码的特性。 我的大四学生建议我,lombok似乎使用反射来减少样板代码,我曾经听说使用反射会影响性能。
我的问题是使用ProjectLombok有什么问题吗?

lombok在运行时不使用反射。它钩住编译器内部并在编译时向类添加代码,然后正常编译。

@chrylis的答案是正确的,但要注意对象图(
@Data
@ToString
注释)例如

Lombok将创建内部具有无限递归的toString。你应该使用
类似于类B中的
@ToString(exclude={“a”})
,但请注意这是非常正常的。Java和Guava集合的行为相同,
Arrays.toString(Object)
。lombok所能做的很少,因为它不能生成所有的
toString
实现。默认toString结果类似于“my.package”。A@35445". 所以没有递归。此外,@Data lombok注释也可能导致方法“hashCode”和“equals”的低效实现。PS我对lombok很满意,但仍然建议使用itOK,您没有收藏,但您可能有一些带有手写
toString
的对象。根据其实现,您是否需要排除字段。Lombok可以通过跟踪
ThreadLocal
中的所有
toString
调用来处理它,但这会减慢所有调用的速度。这可能是一个有用的功能,但几乎没有人要求它为什么低效的
hashCode
/
等于
?因为他们像对待列表一样对待数组?PS:我对龙目岛非常满意(我认为它比java 8的特性要大)。关于<代码> hash码< /> > <代码> @数据< /代码>。hashCode的默认实现使用所有字段。这可能非常耗时,并使哈希代码可变。当然,这是Java代码中常见的问题,但在lombok代码中看不到这样的问题,因为问题是隐藏的。你应该记住这一点,因为这是第一个答案,当我搜索projectlombok资源时,我想补充一点。你是对的。它不会降低运行时的性能,但在编译时存在性能缺陷。我们测试了它,发现编译时间慢了2倍。有关更多信息,请查看以下答案:@ChristianKaiser我不确定这是否真的是一个缺陷,但是是的,必须分叉编译器确实会降低构建速度。
@Data 
public class A {
   private B b;
}

@Data 
public class B {
   private A a;
}