gpt4 book ai didi

java - 如何检查当前方法的参数是否具有注释并在 Java 中检索该参数值?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:14:32 25 4
gpt4 key购买 nike

考虑这段代码:

public example(String s, int i, @Foo Bar bar) {
/* ... */
}

我想检查该方法是否有注释 @Foo 并获取参数,如果没有找到 @Foo 注释则抛出异常。

我目前的做法是先获取当前方法,然后遍历参数注解:

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

class Util {

private Method getCurrentMethod() {
try {
final StackTraceElement[] stes = Thread.currentThread().getStackTrace();
final StackTraceElement ste = stes[stes.length - 1];
final String methodName = ste.getMethodName();
final String className = ste.getClassName();
final Class<?> currentClass = Class.forName(className);
return currentClass.getDeclaredMethod(methodName);
} catch (Exception cause) {
throw new UnsupportedOperationException(cause);
}
}

private Object getArgumentFromMethodWithAnnotation(Method method, Class<?> annotation) {
final Annotation[][] paramAnnotations = method.getParameterAnnotations();
for (Annotation[] annotations : paramAnnotations) {
for (Annotation an : annotations) {
/* ... */
}
}
}

}

这是正确的方法还是有更好的方法?forach 循环中的代码会是什么样子?我不确定我是否理解 getParameterAnnotations 实际返回的内容...

最佳答案

外层for循环

for (Annotation[] annotations : paramAnnotations) {
...
}

应该使用一个明确的计数器,否则你不知道你现在正在处理什么参数

final Annotation[][] paramAnnotations = method.getParameterAnnotations();
final Class[] paramTypes = method.getParameterTypes();
for (int i = 0; i < paramAnnotations.length; i++) {
for (Annotation a: paramAnnotations[i]) {
if (a instanceof Foo) {
System.out.println(String.format("parameter %d with type %s is annotated with @Foo", i, paramTypes[i]);
}
}
}

还要确保您的注释类型使用 @Retention(RetentionPolicy.RUNTIME) 进行注释

从你的问题来看,你想做什么并不完全清楚。我们同意形式参数与实际参数的区别:

void foo(int x) { }

{ foo(3); }

x 是参数,3 是参数?

无法通过反射获取方法的参数。如果可能的话,您将不得不使用 sun.unsafe 包。不过我不能告诉你太多。

关于java - 如何检查当前方法的参数是否具有注释并在 Java 中检索该参数值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7228590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com