如何从java中的方法获取调用者类对象?

Fra*_*iar 2 java class

我知道我可以从中获取方法和类名,StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();但这不是我想要的.我想要类对象,所以我可以访问他的界面,注释等...

有可能的? Class<?> classObject = getCallerClass();

我看到了这个问题,但这只是针对类名.

如何在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.
}
Run Code Online (Sandbox Code Playgroud)

我从很多不同的类中调用someService,如果不可能,我将继续这种方式,但是如果有一种方法可以在运行时获取调用者类,我更喜欢这种方式.

Sla*_*law 7

如果您使用的是 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_FRAMESSHOW_HIDDEN_FRAMES此选项StackWalker已配置。

当存在调用者框架时应调用此方法。如果从堆栈的最底部帧调用它,IllegalCallerException 将被抛出。

UnsupportedOperationException如果StackWalker 未使用该RETAIN_CLASS_REFERENCE选项配置此方法,则会引发此方法。


Zab*_*uza 6

使用链接问题的代码获取类名:如何使用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)

(社区答案,因为只有现有答案的混合).