StackTraceElement getFileName()在lambdas上给出null

时间:2015-10-08 18:50:40

标签: java lambda java-8

我有一个自定义日志记录系统,每个日志记录语句显示日志记录语句的文件名和亚麻布。 除了lambda之外,这很有用。与lambda内部位置对应的StackTraceElement不会生成文件名。这可能与JVM生成某种代码以使lambda工作有关,我不确定。有办法以某种方式获取文件名和行号吗?

2 个答案:

答案 0 :(得分:1)

我们的云服务检测和调试基础架构现在也缺少来自lambda StackTraceElement对象的行号(返回为负)和文件名(返回为null),大大降低了系统生成的跟踪和统计采样代码的实用性。

有人可以解决吗?还是碰巧知道编译器发出的lambda方法名字符串是不是可以收集到有用的调试信息?

java.lang.Thread.sleep(Thread.java:-2)
com.xxx.service.util.ServiceTransactionAnalyzerTest.lambda$null$2(ServiceTransactionAnalyzerTest.java:129)
com.xxx.service.util.ServiceTransactionAnalyzerTest$$Lambda$407/1264404688.run(null:-1)
com.xxx.service.util.ServiceTransaction.lambda$create$0(ServiceTransaction.java:266)
com.xxx.service.util.ServiceTransaction$$Lambda$98/494893410.apply(null:-1)
com.xxx.service.util.ServiceTransaction$$Lambda$160/372124065.inTransaction(null:-1)
com.xxx.service.util.MySQLHibernateTransaction.apply(MySQLHibernateTransaction.java:105)

虽然我知道让Java转发lambda的原始文件名/行由于lambda类的自动生成,所以信息并非一帆风顺,但看起来仍然很简单。是否存在Java错误尚未打开,以将原始文件名/行号信息转发到调试元数据和JRE中?

答案 1 :(得分:0)

您可以获取使用lambda的源文件的名称(在堆栈跟踪的早期版本中),但由于lambdas被编译为内部类,因此它们没有实际的源文件名。

它们也没有行号,因为行号将位于您无法看到的类中(生成的内部类)。