我知道我可以从StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
获取方法和类名,但这不是我想要的。
我想要类对象,所以我可以访问他的界面,注释等...
有可能吗?
Class<?> classObject = getCallerClass();
我看到了这个问题,但这只是针对类名。
How to get the caller class in Java
编辑:现在我以这种方式传递课程:
someService.dummyMethod(foo1, foo2, new Object(){}.getClass());
someService(String foo1, int foo2, Class<?> c) {
// stuff here to get the methodname,
// the interface of the class and an annotation from the interface.
}
我从许多不同的类中调用someService,如果不可能的话,我将继续这种方式,但是如果有一种方法可以在运行时获取调用者类,则我更喜欢这种方式。
答案 0 :(得分:6)
使用链接的问题的代码获取类名:How to get the caller class in Java
然后使用类名来检索类,并使用以下代码:Getting class by its name
完整代码:
String callerName = Thread.currentThread().getStackTrace()[2].getClassName();
try {
Class<?> caller = Class.forName(callerName);
// Do something with it ...
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
(社区答案,因为仅是现有答案的混合)。
答案 1 :(得分:3)
如果您使用的是Java 9+,则可以使用java.lang.StackWalker
。
public void foo() {
Class<?> caller = StackWalker.getInstance(Option.RETAIN_CLASS_REFERENCE)
.getCallerClass();
}
但是,由于StackWalker
是线程安全的,因此创建一个实例并将其存储在某个位置(而不是每次调用该方法时都创建一个新实例)可能是有益的。
getCallerClass()
的Javadoc:
获取调用方的
Class
对象,该对象调用了 调用了getCallerClass
。此方法过滤反射框架
MethodHandle
和隐藏框架 无论SHOW_REFLECT_FRAMES
和SHOW_HIDDEN_FRAMES
选项如何 已为此StackWalker
配置。当存在调用者框架时,应调用此方法。如果是 从堆栈最底端的帧
IllegalCallerException
调用 将被抛出。如果此
UnsupportedOperationException
,则此方法抛出StackWalker
没有配置RETAIN_CLASS_REFERENCE
选项。