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.   

    public class ObjectTest {
    private String name;
    public ObjectTest(String name){
    this.name = name}
    public void whoCalledMe() {
    System.out.printlen(name+" called me.")}
    }public class ClassOne {
    public static void main(String args[]) {
    ObjectTest obj = new ObjectTest("ClassOne");
    obj.whoCalledMe();
    }
    }
      

  2.   

    楼上说的对的,比如
    public void whoCalledMe(String msg) {}
       System.out.println(msg);
    }obj.whoCalledMe("在ClassOne里实例化的");
      

  3.   

    sorry, 是我表述的还不太清楚吧环境:
    1. 只能使用无参构造函数
    2. 具体的实例化并不由我控制,换言之我只负责ObjectTest类的开发,对于是否由 ClassOne, ClassTwo, ClassThree 或者其它类来创建此ObjectTest类对象我并不知情目的:
    通过whoCalledMe()函数来获取到底是哪一个类实现了此ObjectTest类对象Thanks.
      

  4.   

    通过whoCalledMe()函数来追踪到底有哪些具体的类实例化了(使用了)此ObjectTest类的对象
      

  5.   

    既然只能使用无参数构造器,那就在whoCalledMe()函数中加入参数把~
    public class ObjectTest {
    public ObjectTest(){}
    public void whoCalledMe(String name){
    System.out.println(name+"calledME");
    }
    }
      

  6.   

    搜索这个类被哪些文件引用到了,在看一下代码,eclipse有快捷键的吧
      

  7.   

    好吧,我这么说吧现在存在一个ObjectTest类,此类中只实现了一个无参构造函数和一个whoCalledMe()方法(排除了有参构造与多态影响,并且不能添加其它任何field和method),现在我们只能通过实现whoCalledMe()方法来获得到底是哪一个Class类实例化了ObjectTest类的对象我知道Java提供的API中可能并没有实现此查询功能,所以大家仅作探讨吧
      

  8.   

    有没有可能从 this 关键字着手,另外可不可以通过对象的指针逆向实现此功能
      

  9.   

    参考:
    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);
    }
    }
      

  10.   

    高手啊,1、2、3三个类都一样,调了test类的方法,现在又要test类去找是哪个类调用了自己。
    我凌乱了,我突然想到了 是先有鸡还是先有蛋 的问题了。
      

  11.   

    return getClassContext()[2].getName();//0 是 这个内部类,1 是ObjectTest,2是外部直接调用类
    这个方法从未用过,学习了
      

  12.   

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

  13.   

    Class[] stack = (new java.lang.SecurityManager()).getClassContext();
    通过堆栈来反推,此方法确实可行,领教了