我有类似的课程:
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方法所在的函数的类。
答案 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
,在print
和MyObject
中提供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.html或Get current stack trace in Java