У меня есть метод, который принимает функциональный параметр, например. a Runnable
. Поскольку это метод библиотеки, я хочу, чтобы он использовал регистратор, полученный из функционального параметра. Вызов getClass
по функциональному параметру отлично подходит для обычных классов, и я могу getEnclosingClass
для вложенных или анонимных классов; но если это лямбда-выражение, оно возвращает некоторое неясное имя, содержащее $$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
.
Любые идеи?