日期:2014-05-20  浏览次数:20820 次

Java SE: 对象调用
public class ObjectTest {
public ObjectTest(){}
public void whoCalledMe() {}
}

public class ClassOne {
public static void main(String args[]) {
ObjectTest obj = new ObjectTest();
obj.whoCalledMe();
}
}

public class ClassTwo {
public static void main(String args[]) {
ObjectTest obj = new ObjectTest();
obj.whoCalledMe();
}
}

public class ClassThree {
public static void main(String args[]) {
ObjectTest obj = new ObjectTest();
obj.whoCalledMe();
}
}


怎样实现ObjectTest中的whoCalledMe()方法来获得是哪一个类( ClassOne ClassTwo ClassThree )实例化的此ObjectTest对象
------解决方案--------------------
你可以用一个带参数的构造函数实现
------解决方案--------------------
1楼正解。
你想在类里面直接判断它的一个对象是在哪里实例化是不行的。
但是可以通过传参,告诉它是在哪里实例化的。
------解决方案--------------------
参考:
http://www.cnblogs.com/jingle1267/archive/2012/12/04/2801262.html
写了一下,楼主参考:
代码:
//filename is:FindTheClassOfTheMethodCall.java
//
package csdn.oop;

class ObjectTest 
{
public ObjectTest(){}
public void whoCalledMe()
        {
//--------------------------------------------就这部分
String clazzName = new SecurityManager()
{
public String getClassName()
{
return getClassContext()[2].getName();//0 是 这个内部类,1 是ObjectTest,2是外部直接调用类,3 是更上一级。
}
}.getClassName();
System.out.println("Current class that invoking this method is:  "+clazzName);
}
}

class ClassOne
{
public static void main(String args[]) 
{
ObjectTest obj = new ObjectTest();
obj.whoCalledMe();
}
}

class ClassTwo 
{
public static void main(String args[]) 
{
ObjectTest obj = new ObjectTest();
obj.whoCalledMe();
}
}

class ClassThree
{
public static void main(String args[]) 
{
ObjectTest obj = new ObjectTest();
obj.whoCalledMe();
}
}
class  FindTheClassOfTheMethodCall
{
public static void main(String[] args) 
{
ClassOne.main(args);
ClassTwo.main(args);
ClassThree.main(args);
}
}

------解决方案--------------------
可以取到,参考14楼的方式,或者通过类似下面的代码从当前调用线程的堆栈获取,楼主试试
Thread.currentThread().getStackTrace()[2].getClassName()


之前用下面这种方式获取过当前类名
Thread.currentThread().getStackTrace()[1].getMethodName();