【问题标题】:Get class name by Consumer<> object通过 Consumer<> 对象获取类名
【发布时间】:2015-03-29 14:53:43
【问题描述】:

我想使用Consumer&lt;&gt; 类的对象检测类名。

例子

MyClass myObject = new MyClass();

someMethod(myObject::myMethod);

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

有可能吗?

【问题讨论】:

  • 可能XY Problem?换句话说,你是想解决一些潜在的问题,还是只是对此感到好奇?如果是前者,请告诉我们更多有关潜在问题的信息。
  • 谢谢,我对“XY 问题”一词一无所知。但我的问题不是“XY 问题”。我在下一条评论中的解决方案。
  • 我需要类名来记录日志。

标签: reflection java-8 method-reference


【解决方案1】:

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

请注意,我们将跳过索引0 处的StackTraceElement,因为它始终是java.lang.Thread

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

void someMethod(Consumer<String> fn) {
     String callerClass = CallInspector.getCallingClassName();
}

【讨论】:

  • 谢谢,有趣的方法。但我已经写得更容易了。我的解决方案看起来像 someMethod(myObject::myMethod, myObject.getClass().getSimpleName()); void someMethod(Consumer&lt;String&gt; fn, String caller){}
猜你喜欢
  • 2021-02-21
  • 2019-05-14
  • 1970-01-01
  • 2014-09-23
  • 2015-06-06
  • 2017-10-27
  • 1970-01-01
  • 2020-05-01
  • 1970-01-01
相关资源
最近更新 更多