获取调用方方法(java.lang.reflect.Method)

我想得到调用方法java.lang.reflect.Method。 方法的名称。

这是一个如何获取调用方类的示例。

// find the callers class

Thread t = Thread.getCurrentThread();

Class<?> klass = Class.forName(t.getStackTrace()[2].getClassName());

// do something with the class (like processing its annotations)

...

仅用于测试目的!

回答:

如果仅用于测试,则可能有效。它假定可以通过调用类的类访问类文件ClassLoader,并且类文件已使用调试符号进行编译(我希望它们用于测试!)。此代码依赖于ASM字节码库。

public static Method getMethod(final StackTraceElement stackTraceElement) throws Exception {

final String stackTraceClassName = stackTraceElement.getClassName();

final String stackTraceMethodName = stackTraceElement.getMethodName();

final int stackTraceLineNumber = stackTraceElement.getLineNumber();

Class<?> stackTraceClass = Class.forName(stackTraceClassName);

// I am only using AtomicReference as a container to dump a String into, feel free to ignore it for now

final AtomicReference<String> methodDescriptorReference = new AtomicReference<String>();

String classFileResourceName = "/" + stackTraceClassName.replaceAll("\\.", "/") + ".class";

InputStream classFileStream = stackTraceClass.getResourceAsStream(classFileResourceName);

if (classFileStream == null) {

throw new RuntimeException("Could not acquire the class file containing for the calling class");

}

try {

ClassReader classReader = new ClassReader(classFileStream);

classReader.accept(

new EmptyVisitor() {

@Override

public MethodVisitor visitMethod(int access, final String name, final String desc, String signature, String[] exceptions) {

if (!name.equals(stackTraceMethodName)) {

return null;

}

return new EmptyVisitor() {

@Override

public void visitLineNumber(int line, Label start) {

if (line == stackTraceLineNumber) {

methodDescriptorReference.set(desc);

}

}

};

}

},

0

);

} finally {

classFileStream.close();

}

String methodDescriptor = methodDescriptorReference.get();

if (methodDescriptor == null) {

throw new RuntimeException("Could not find line " + stackTraceLineNumber);

}

for (Method method : stackTraceClass.getMethods()) {

if (stackTraceMethodName.equals(method.getName()) && methodDescriptor.equals(Type.getMethodDescriptor(method))) {

return method;

}

}

throw new RuntimeException("Could not find the calling method");

}

以上是 获取调用方方法(java.lang.reflect.Method) 的全部内容, 来源链接: utcz.com/qa/401487.html

回到顶部