如何从java中的方法获取调用方类对象?
我知道我可以从如何从java中的方法获取调用方类对象?,java,class,Java,Class,我知道我可以从StackTraceeElement[]stackTrace=Thread.currentThread().getStackTrace()获取方法和类名
StackTraceeElement[]stackTrace=Thread.currentThread().getStackTrace()获取方法和类名但是那不是我想要的。
我想要类对象,这样我就可以访问他的接口、注释等
有可能吗?
Class classObject=getCallerClass()代码>
我看到了这个问题,但那只是为了类名
编辑:现在我通过以下方式传递该类:
someService.dummyMethod(foo1,foo2,newobject(){}.getClass())代码>
someService(字符串foo1,int foo2,类c){
//这里的东西来获取方法名,
//类的接口和接口中的注释。
}
我从许多不同的类调用某个服务,如果不可能,我将继续这种方式,但如果有一种方式可以在运行时获取调用方类,我更喜欢这种方式。使用链接问题的代码获取类名:
然后使用类名检索类,代码如下:
完整代码:
String callerName = Thread.currentThread().getStackTrace()[2].getClassName();
try {
Class<?> caller = Class.forName(callerName);
// Do something with it ...
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
String callerName=Thread.currentThread().getStackTrace()[2].getClassName();
试一试{
Class caller=Class.forName(callerName);
//用它做点什么。。。
}catch(classnotfounde异常){
e、 printStackTrace();
}
(社区答案,因为只有现有答案的混合)。如果您使用的是Java 9+,您可以使用
public void foo(){
Class caller=StackWalker.getInstance(Option.RETAIN\u Class\u引用)
.getCallerClass();
}
但是,由于StackWalker
是线程安全的,因此创建一个实例并将其存储在某处(而不是每次调用该方法时都创建一个新实例)可能是有益的
getCallerClass()的Javadoc
:
获取调用该方法的调用方的类
对象
调用了getCallerClass
此方法过滤反射帧、MethodHandle
和隐藏帧
不考虑显示\u反射\u帧
和显示\u隐藏\u帧
选项
此StackWalker
已配置为
当存在调用方帧时,应调用此方法。如果是
从堆栈最底部的帧调用,IllegalCallerException
将被抛出
如果此StackWalker
未使用RETAIN\u CLASS\u REFERENCE
选项配置
“类对象”?你这到底是什么意思?不管怎样,为什么你不能从stackTrace中得到它呢?我强烈建议不要做这样的事情。你试图在这里做的是一个糟糕的架构的明显标志。如果一个方法需要对其调用者的引用,它应该要求它作为参数,然后调用者应该提供自己:foo(this)代码>。请注意,类
对象只表示类,而不是实例。听起来你想要得到这个实例。因此,您可能需要类似于引用的东西。我想您手头已经有了类名,不是吗?您可以检索给定名称的类
对象。请参阅。仔细阅读您链接的完整问题()。一些答案展示了如何检索类
对象,而不仅仅是名称。很酷的解决方案!但不幸的是,我使用的是Java8,但很高兴能确切地知道我需要什么!(非常高兴我终于摆脱了Java8LOL)
String callerName = Thread.currentThread().getStackTrace()[2].getClassName();
try {
Class<?> caller = Class.forName(callerName);
// Do something with it ...
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
public void foo() {
Class<?> caller = StackWalker.getInstance(Option.RETAIN_CLASS_REFERENCE)
.getCallerClass();
}