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

时间:2018-08-09 13:12:50

标签: java class

我知道我可以从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,如果不可能的话,我将继续这种方式,但是如果有一种方法可以在运行时获取调用者类,则我更喜欢这种方式。

2 个答案:

答案 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_FRAMESSHOW_HIDDEN_FRAMES选项如何   已为此StackWalker配置。

     

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

     

如果此UnsupportedOperationException,则此方法抛出StackWalker   没有配置RETAIN_CLASS_REFERENCE选项。