作为参数,如何查找哪个类调用当前方法

时间:2013-12-12 11:01:22

标签: java

以下java中的情况

在当前类中说有一个方法调用returnStr,并且此方法将返回一个String,并且此方法可能在其他类中作为参数调用,所以有什么方法可以帮助我找出哪个类调用此方法?

 public class MyClass {
    public String returnStr() {
        // System.out.println("which class invokes me @_@")

        return "ABC";
    }
}

class D {
    public void printStr(String str) {
        System.out.println(str);
    }
}

class B {
    public void printStr(String str) {
        System.out.println(str);
    }
}

class C {
    public void printStr(String str) {
        System.out.println(str);
    }
}

public class Test {
    public static void main(String... args) {
        MyClass myClass = new MyClass();
        A a = new A();
        B b = new B();
        C c = new C();
        a.printStr(myClass.returnStr());
        b.printStr(myClass.returnStr());
        c.printStr(myClass.returnStr());
        }
    }
如上面的代码,有没有办法帮我打印A,B,C这三个类的名字?我试图获取StackTrace数组,但我只能获得调用returnStr()的名称“Test”。

提前致谢。

4 个答案:

答案 0 :(得分:0)

您可以使用Eclipse或IntelliJ Idea等IDE。他们有这样的功能。

enter image description here

答案 1 :(得分:0)

即使你修复了复制/粘贴错误 * 之后,也绝对没有办法做你想做的事情:Test类在这里进行所有调用;它传递myClassABC的结果 在调用MyClass时在堆栈上。

可以说,没有理由让方法找到它的调用者:通常,方法(和过程语言中的函数)提供旨在隐藏调用者的逻辑的抽象级别,并将调用者与逻辑隔离(除非他选择通过参数“宣布”自己。

这应该会引导您找到一个解决方案:由于该方法无法确定其输出将被路由到谁,调用者应该在参数中传递此信息,如下所示:

public String returnStr(String whosCallingMe) {
    System.out.println(whosCallingMe);
    return "ABC";
}

现在调用这样的方法:

a.printStr(myClass.returnStr("A"));
b.printStr(myClass.returnStr("B"));
c.printStr(myClass.returnStr("C"));

<小时/> * 所有三个调用都转到A类型的对象,因为您忘记在复制的代码中将a.printStr替换为b.printStrc.printStr /pasted.

答案 2 :(得分:0)

简单的方法:

  • 通过ThreadLocal传递此特定班级的被叫方。缺点是它是一个单线程解决方案。
  • 将被调用者作为参数传递给方法。这种方式是线程安全的。

答案 3 :(得分:0)

尝试此操作,将类的实例传递给returnStr()以从调用方法的位置获取类。以下所有文件都在同一个软件包下。

ParameterInstance .java

public class ParameterInstance {
    public String returnStr(Object obj) {
        // System.out.println("which class invokes me @_@")
        System.out.println("Class is :: " + obj.getClass());
        return "ABC";
    }
}


class A {
    public void printStr(String str) {
        System.out.println(str);
    }
}


class D {
    public void printStr(String str) {
        System.out.println(str);
    }
}

class B {
    public void printStr(String str) {
        System.out.println(str);
    }
}

class C {
    public void printStr(String str) {
        System.out.println(str);
    }
}

<强> Test.java

public class Test {
    public static void main(String... args) {
        ParameterInstance myClass = new ParameterInstance();
        A a = new A();
        B b = new B();
        C c = new C();
        a.printStr(myClass.returnStr(a));
        b.printStr(myClass.returnStr(b));
        c.printStr(myClass.returnStr(c));
    }
}