在Java中,查找从方法内部调用方法的静态对象

时间:2012-07-21 23:39:02

标签: java

我有类似的课程:

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函数,我该如何确定哪个对象 调用打印函数,MyClass1中的那个,或者MyClass2中的那个?

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

3 个答案:

答案 0 :(得分: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,在printMyObject中提供MyClass1参数或子类MyClass2并覆盖print

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

答案 2 :(得分:-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.htmlGet current stack trace in Java