3

我想使用类的对象检测类名Consumer<>

例子

MyClass myObject = new MyClass();

someMethod(myObject::myMethod);

void someMethod(Consumer<String> fn) {
    // here i want to know class name "MyClass" through fn
}

可能吗?

4

1 回答 1

0

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);
    }
}

请注意,我们将跳过StackTraceElementat index 0,因为它将始终是java.lang.Thread

然后,在您myMethod()只需调用实用程序之一:

void someMethod(Consumer<String> fn) {
     String callerClass = CallInspector.getCallingClassName();
}
于 2015-03-29T19:32:22.913 回答