使用Consumer<>获取类名宾语

时间:2015-03-29 14:53:44

标签: reflection java-8 method-reference

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

实施例

MyClass myObject = new MyClass();

someMethod(myObject::myMethod);

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

有可能吗?

1 个答案:

答案 0 :(得分: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);
    }
}

请注意,我们正在跳过索引StackTraceElement的{​​{1}},因为它始终为0

然后,在你的java.lang.Thread中只调用一个实用程序:

myMethod()