我想使用类的对象检测类名Consumer<>
。
例子
MyClass myObject = new MyClass();
someMethod(myObject::myMethod);
void someMethod(Consumer<String> fn) {
// here i want to know class name "MyClass" through fn
}
可能吗?
我想使用类的对象检测类名Consumer<>
。
例子
MyClass myObject = new MyClass();
someMethod(myObject::myMethod);
void someMethod(Consumer<String> fn) {
// here i want to know class name "MyClass" through fn
}
可能吗?
该fn
参数不包含有关调用类的信息。
但是,您可以使用一个static
方法来实现一个实用程序类,它可以为您完成这项工作。您可以利用Thread.currentThread().getStackTrace()
表达式生成的数组来检查导致您的方法的回调的跟踪。例如:
public final class CallInspector {
public final static String getCallingClassName() {
StackTraceElement[] stElements = Thread.currentThread().getStackTrace();
return IntStream.range(1, stElements.length)
.mapToObj(i -> stElements[i].getClassName())
.filter(name -> !name.equals(CallInspector.class.getName()))
.findFirst()
.orElse(null);
}
}
请注意,我们将跳过StackTraceElement
at index 0
,因为它将始终是java.lang.Thread
。
然后,在您myMethod()
只需调用实用程序之一:
void someMethod(Consumer<String> fn) {
String callerClass = CallInspector.getCallingClassName();
}