![](/img/trans.png)
[英]How do I access the object that's been instantiated from the abstract class's subclass in java?
[英]Java - determine where an object is instantiated from object's class
假设我有一个名为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
}
}
这是不可取的,并且可能会以最意外的方式(和预期的方式)中断。 因此,我希望您不要在生产代码中使用它。
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);
}
}
在构造函数中传递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
}
}
在纯Java中,您可以尝试使用堆栈跟踪来获取此类信息。 当然,您不应该对2
硬编码,它可能非常脆弱,并且在使用代理,拦截器等时可能不起作用。您可以将其放入构造函数中
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
System.out.println(stackTrace[2].getClassName());
至于您在标记中提到的google-reflection,我认为它不支持此类操作,因为这不是反射。
我不建议使用这种方法,但是,如果您真的想这样做,那么这是我可以想到的有效示例。
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();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.