0

假设我有一个名为 的类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

4 回答 4

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);
    }
}
于 2015-07-02T07:37:34.837 回答
2

在构造函数中传递调用者类名..

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
    }
}
于 2015-07-02T07:20:29.423 回答
0

在纯 Java 中,您可以尝试使用 Stack Trace 来获取此类信息。当然,你不应该硬编码2,它可能很脆弱,当你使用代理、拦截器等时它可能不起作用。你可以把它放在构造函数中

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

至于您在标签中提到的 google-reflections,我认为它不支持此类操作,因为这不是反射。

于 2015-07-02T07:37:58.657 回答
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();
    }

}
于 2015-07-02T07:41:41.293 回答