Java—确定从对象';s级
假设我有一个名为Java—确定从对象';s级,java,reflections,Java,Reflections,假设我有一个名为MyClass的类,在这个类中,我想找出实例化MyClass对象的类名,例如: class MyClass { final String whoCreatedMe; public MyClass() { whoCreatedMe = ??? } } public class Driver { public static void main(String[] args) { System.out.println(ne
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
}
}
在构造函数中传递调用方类名
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
}
}
在构造函数中传递调用方类名
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
}
}
这是不可取的,可能会以最意外(和预期)的方式中断。所以我希望您不要在生产代码中使用它
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);
}
}
这是不可取的,可能会以最意外(和预期)的方式中断。所以我希望您不要在生产代码中使用它
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);
}
}
在纯Java中,您可以尝试使用堆栈跟踪来获取此类信息。当然,您不应该硬编码
2
,它可能非常脆弱,并且在使用代理、拦截器等时可能无法工作。
你可以把它放到构造函数中
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
System.out.println(stackTrace[2].getClassName());
至于您在标签中提到的google reflection,我认为它不支持这样的操作,因为这不是反射。在纯Java中,您可以尝试使用堆栈跟踪来获取此类信息。当然,您不应该硬编码
2
,它可能非常脆弱,并且在使用代理、拦截器等时可能无法工作。
你可以把它放到构造函数中
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
System.out.println(stackTrace[2].getClassName());
至于您在标签中提到的google reflections,我认为它不支持这样的操作,因为这不是反射。我不建议使用这种方法,但是,如果您真的想这样做,这里有一个我可以想到的工作示例
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();
}
}
我不建议使用这种方法,但是,如果你真的想这样做,这里有一个我可以想到的工作示例
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();
}
}
好。。。这是可行的,但我不必问我是否能做到:)是的。。你可以这样做。。我上一篇文章中有一个错误。。您应该使用
whoCreatedMe
删除final
。。。这是可行的,但我不必问我是否能做到:)是的。。你可以这样做。。我上一篇文章中有一个错误。。您应该使用whoCreatedMe
删除final
,字符串是不可变的-根本没有任何方法可以让您更改字符串(除非您使用反射-然后见鬼去吧)。让我们退一步:您认为为什么要这样做?你真正想解决的问题是什么?字符串是不可变的-根本没有任何方法可以让你更改字符串(除非你使用反射-见鬼去吧)。让我们退一步:你认为你为什么要这么做?你真正想解决的问题是什么?