为什么Java没有公开基于toString / hashCode / equals的编译时间反射?

时间:2015-07-03 06:32:29

标签: java reflection compilation

如果我理解它是正确的,除了实际的函数处理(toString / hashCode / equals)之外,如果Java可以计算请求编译时反射的对象的函数,它应该不需要任何费用。

对于上/下对象的情况,行为仍然比指针地址更好,因为toString表示,实际上是没用的。

这样的东西
// Returns the compile time 'ReflectionToStringBuilder.toString(foo)'
foo.tryToString()

我错过了什么?

回复评论我在问题中找到了正确的字词。

为什么我们必须将代码(/ eclipse生成)交给可以由Java编译器完成的String / hash / equals?

1 个答案:

答案 0 :(得分:4)

  1. Java是一种非常保守的语言,20年后更改默认行为会改变现有程序。这是Java中通常尽可能避免的事情。
  2. 如果toString总是返回每个字段的值,那么它会打开一个程序最多两个风险,a)生成的字符串可能会变得非常大,即垃圾邮件日志和b)由于循环引用而变得如此之大或者大数据它永远不会结束并导致堆栈溢出或内存不足异常(两者都可以通过增加额外的成本/复杂性来避免)。
  3. 默认为哈希并不是无用的,作为调试器中的默认行为,它提供了关于对象身份而不是相等的线索..对于某些类的bug很有用。
  4. 某些字段可能包含敏感信息,例如密码或信用卡号。此类字段不应在日志中完整显示。 (chrylis)