Java - 确定从对象的类中实例化对象的位置

时间:2015-07-02 07:17:27

标签: java google-reflections

假设我有一个名为MyClass的类,在这个类中,我想找出实例化MyClass对象的类名,例如:

class MyClass {
    final String whoCreatedMe;
    public MyClass() {
        whoCreatedMe = ???
    }
}

public class Driver {
    public static void main(String[] args) {
        System.out.println(new MyClass().whoCreatedMe); // should print Driver
    }
}

4 个答案:

答案 0 :(得分:3)

这是不可取的,并且可能以最意想不到的(和预期的)方式打破。所以我希望你不会在生产代码中使用它。

public class Temp {

    static class TestClass {
        public final String whoCreatedMe;
        public TestClass() {
            StackTraceElement ste = Thread.getAllStackTraces().get(Thread.currentThread())[3];
            whoCreatedMe = ste.getClassName();
        }
    }

    public static void main(String[] args) throws Exception {

        System.out.println(new TestClass().whoCreatedMe);
    }
}

答案 1 :(得分:2)

在构造函数中传递Caller类名。

class MyClass {
    String whoCreatedMe;
    public MyClass() {
    }
    public MyClass(String mCallerClass) {
        this.whoCreatedMe = mCallerClass;
        System.out.println(this.whoCreatedMe+" instantiated me..");
    }
}

public class Driver {
    public static void main(String[] args) {
        System.out.println(new MyClass(this.getClass().getName())); // should print Driver but no quotes should be there in parameter
    }
}

答案 2 :(得分:0)

在普通Java中,您可以尝试使用堆栈跟踪来获取此类信息。当然,你不应该硬编码2,它可能非常脆弱,当你使用代理,拦截器等时它可能不起作用。 你可以把它放在构造函数

        StackTraceElement[] stackTrace =  Thread.currentThread().getStackTrace();
        System.out.println(stackTrace[2].getClassName());

至于你在标签中提到的谷歌反思,我不认为它支持这样的操作,因为这不是反思。

答案 3 :(得分:0)

我不会建议这种方法,但如果你真的想这样做,这是一个我能想到的工作实例。

public class Driver {
     public static void main(String[] args) {
            System.out.println(new MyClass().whoCreatedMe); // should print Driver
        }
}


public class MyClass {

    public String whoCreatedMe;

    public MyClass(){
        Exception ex = new Exception();
        StackTraceElement[] stackTrace = ex.getStackTrace();
        whoCreatedMe = stackTrace[1].getClassName();
    }

}