【问题标题】:How can i know the name of class who is calling my class ? i need not want the callee to provide any information abut its class [duplicate]我怎么知道给我上课的班级的名字?我不需要被调用者提供有关其类的任何信息[重复]
【发布时间】:2013-03-07 08:21:08
【问题描述】:

我需要对此提出建议

 class A{
    B b;
 }

 Class B{
    P String  something();
 }

 class test{
    B b = new B();
    b.something();
 }

something()

必须返回 cal-lee 类的名称 就像有人叫我(按名字)我应该知道他的名字。

【问题讨论】:

  • 你想在这里得到“A”还是“B”?
  • 请查看以下链接。 stackoverflow.com/questions/421280/…希望对你有帮助
  • 如果您需要知道谁在给您打电话,您很可能遇到了设计/架构问题。

标签: java


【解决方案1】:

一种解决方案是以编程方式生成堆栈跟踪:

private static String getCallerName() {
    StackTraceElement[] stElements = Thread.currentThread().getStackTrace();
    for (int i=1; i<stElements.length; i++) {
        StackTraceElement ste = stElements[i];
        if (!ste.getClassName().equals("B") && ste.getClassName().indexOf("java.lang.Thread")!=0) {
            return ste.getClassName();
            // you could also use ste.getMethodName() or ste.getLineNumber()
        }
    }
    return null;
}

你可以这样使用它,例如:

public void something() {
   System.out.println("called by " + getCallerName());
}

【讨论】:

  • 我可以知道你在哪里用过这个吗? (独立,分布式)
  • +1,我做了一个 if(true){try{throw new NullpointerException()}catch(Exception ex){ 在这里我有堆栈跟踪 }} :)
  • @aksappy 我不确定我是否收到您的评论。我在一些调试工具中使用了类似的东西。
  • 有什么替代方法可以代替 StackTraceElement[] 吗?
  • @user2143318 为什么?这仅在记录或调试时才有意义。堆栈跟踪有什么问题?
【解决方案2】:

如果有人直呼你的名字,你不会知道,除非有人已经告诉过你。

这里也一样。

将你的名字从 A 类传给 B 类。

【讨论】:

  • 是的,我不应该知道。但我的要求是知道打电话给我的人。感谢您对问题的不同看法。
【解决方案3】:

由于问题似乎有点不同寻常,因此是一种架构替代方案。是否更合适我不知道。

class A {
    class C extends B {
        String something() {
            ... A.this
        }
    }
}

【讨论】:

    猜你喜欢
    • 2019-10-15
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 2015-06-29
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多