Java 在构造函数中,找到创建对象的类?

Java 在构造函数中,找到创建对象的类?,java,constructor,Java,Constructor,以下是我想做的: 在我的代码中,我有一组创建其他类对象的类。我想做的是,在调用构造函数的类的构造函数中,首先找到调用构造函数的类 例如: Main.java: public class Main { public static void main(String[] args) { Test t = new Test(); } } Test.java: public class Test { public Test(){ //somehow f

以下是我想做的:

在我的代码中,我有一组创建其他类对象的类。我想做的是,在调用构造函数的类的构造函数中,首先找到调用构造函数的类

例如:

Main.java:

public class Main {

    public static void main(String[] args) {
        Test t = new Test();
    }

}
Test.java:

public class Test {
    public Test(){
    //somehow find the class where I came from :(
    }
}

假设您无法传入调用方的类对象:除了需要这样做意味着一个相当讨厌的设计之外,唯一的方法是构造一个异常并检查其中的最后一个堆栈跟踪元素:

Exception e = new Exception();
StackTraceElement[] elements = e.getStackTrace();
数组中的第一个元素就是您要查找的元素


(在评论后更新)这在JITted环境中无法持续工作。

您可以使用以下内容:

public class Main {
    public static void main(String[] args) {
        new Main().runMe();
    }

    public void runMe() {
        new Test(this.getClass());
    }
}

class Test {
    public Test(Class clazz) {
        System.out.println("I was invoked from '" + clazz.getCanonicalName() + "' class.");
    }
}
印刷品:

我是从“Main”类调用的


不,如果不显式地将值传递给构造函数或构造堆栈跟踪,就无法做到这一点-由于JIT内联,这可能是不准确的。Noo!这种设计听起来像一场噩梦:|请注意,这样做是对面向对象原则的严重违反。如果你想从一个不同的位置构造这个类,它会强迫你重写这个类的构造函数。让调用类传入一个参数,说明它希望构造函数做什么。我试图在构造函数中调用一个类,但它给了我一个“无效类型”错误。你想说你复制了我的代码,运行它,但它不起作用吗?+1这是唯一可靠的方法。@Boann,非常感谢。噢!没关系,我现在明白了,我没有在“class”中大写“C”,所以它给了我一个错误。对不起,谢谢!很好,谢谢!是的,我知道我的设计有缺陷:)@cyentw我知道它能用。但请不要这样做。我实际上在初始化记录器时使用了它-我认为这实际上是一个很好的用例(从每个类调用
Logger.getLogger()
,比在每个类中手动指定类名更不容易出错,因为不可避免地会用错误的名称复制一个类!)@berry120所以也许应该教育人们不要复制和粘贴代码。@berry120另外,您正在设置自己由于JIT而失败。不太可能,但理论上仍然可能。