我知道我可以从中获取方法和类名,StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();但这不是我想要的.我想要类对象,所以我可以访问他的界面,注释等...
有可能的?
Class<?> classObject = getCallerClass();
我看到了这个问题,但这只是针对类名.
编辑:现在我以这种方式传递课程:
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.
}
Run Code Online (Sandbox Code Playgroud)
我从很多不同的类中调用someService,如果不可能,我将继续这种方式,但是如果有一种方法可以在运行时获取调用者类,我更喜欢这种方式.
如果您使用的是 Java 9+,则可以使用java.lang.StackWalker.
public void foo() {
Class<?> caller = StackWalker.getInstance(Option.RETAIN_CLASS_REFERENCE)
.getCallerClass();
}
Run Code Online (Sandbox Code Playgroud)
但是,由于StackWalker是线程安全的,因此创建一个实例并将其存储在某处可能是有益的(而不是每次调用该方法时都创建一个新实例)。
的Javadoc getCallerClass():
获取
Class调用方法的调用者的对象getCallerClass。此方法滤波器反射的帧,
MethodHandle以及隐藏帧不管SHOW_REFLECT_FRAMES与SHOW_HIDDEN_FRAMES此选项StackWalker已配置。当存在调用者框架时应调用此方法。如果从堆栈的最底部帧调用它,
IllegalCallerException将被抛出。
UnsupportedOperationException如果StackWalker未使用该RETAIN_CLASS_REFERENCE选项配置此方法,则会引发此方法。
使用链接问题的代码获取类名:如何使用Java获取调用者类
然后使用类名来检索类,使用此处的代码:按名称获取类
完整代码:
String callerName = Thread.currentThread().getStackTrace()[2].getClassName();
try {
Class<?> caller = Class.forName(callerName);
// Do something with it ...
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
(社区答案,因为只有现有答案的混合).
| 归档时间: |
|
| 查看次数: |
1322 次 |
| 最近记录: |