0

我有类似于这些的课程:

class MyClass1 {

  static MyObject obj = new MyObject();

  public static void doSomething()
  { 
    MyClass1.obj.print();
    MyClass2.obj.print();
  } 

}    

class MyClass2 {

  static MyObject obj = new MyObject();

  public static void doSomething()
  {
    MyClass1.obj.print();
    MyClass2.obj.print();
  }

}

public class MyObject {

  public void print()
  {
    System.out.println("Which object called me?");
  }

}

从 MyObject 中的 print 函数,我如何确定哪个对象调用了 print 函数,是 MyClass1 中的那个,还是 MyClass2 中的那个?

使用堆栈跟踪,我只能找到 print 方法所在的函数以及 print 方法所在的函数的类。

4

3 回答 3

0

只是

public void print()
{
    System.out.println("Which object called me?");
    if (MyClass1.obj == this) {
        System.out.println("MyClass1");
    } else if (MyClass2.obj == this) {
        System.out.println("MyClass2");
    }
}

...只要两个 obj 字段都已初始化。

但是,嗯,我不会这样做。MyObject最好在构造时告诉这一点,在and和 override中给出print参数或子类。MyObjectMyClass1MyClass2print

于 2012-07-21T23:57:57.033 回答
0

你为什么不把它作为你的对象模型中的一流概念呢?

class MyClass1 {
    private static MyObject obj = new MyObject("MyClass1");
    public static void doSomething() {
        MyClass1.obj.print();
        MyClass2.obj.print();
    }
}

class MyClass2 {
    private static MyObject obj = new MyObject("MyClass2");
    public static void doSomething() {
        MyClass1.obj.print();
        MyClass2.obj.print();
    }
}

class MyObject {
    private final String name;
    MyObject(String name) {
        this.name = name;
    }

    public void print() {
        System.out.println("Q: Which object called me?");
        System.out.println("A: " + name);
    }
}
于 2012-07-22T00:13:49.057 回答
-1

以下代码应该可以工作:

public class MyObject {
    public static void main(String... args){
        MyClass2.doSomething();
    }


  public void print()
  {
    System.out.println(Thread.currentThread().getStackTrace()[2].getClassName() + " has me called.");
  }
}

在以下位置查看更多信息:http: //download.oracle.com/javase/6/docs/api/java/lang/StackTraceElement.html在 Java 中获取当前堆栈跟踪

于 2012-07-21T23:57:56.697 回答