我有一个接受函数参数 (例如 Runnable
) 的方法。由于这是一个库方法,我希望它使用从函数参数派生的记录器。调用函数参数的 getClass
对于普通类可以正常工作,并且我可以使用 getEnclosingClass
来获取嵌套或匿名类;但如果是 lambda 表达式,则返回一些包含 $$Lambda$
的模糊名称,我可以手动去掉它:
Class<?> type = runnable.getClass();
String canonical = type.getCanonicalName();
int lambdaOffset = canonical.indexOf("$$Lambda$");
if (lambdaOffset > 0) {
try {
type = Class.forName(canonical.substring(0, lambdaOffset));
} catch (ClassNotFoundException e) {
// strange, but we can stick to the type we already have
}
}
如您所见,这并不是非常优雅的,可能也不太可移植。我已经尝试了getEnclosingClass
、getEnclosingMethod
和getEnclosingConstructor
,但它们都返回null
。
有什么想法吗?