Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从java中的方法获取调用方类对象?_Java_Class - Fatal编程技术网

如何从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();
}