看起来给定一个Field或Element,我们可以使用getEnclosingClass或getDeclaringClass,但不能使用成员本身。如果我们可以将一个成员变成一个成员,我们可以解决这个问题。有人知道吗?
具体来说,对于以下代码段:
@DoBinding
public Class Foo{
static String bar=MyUtil.bindValue(bar);
.....
}
在bindValue方法中,我需要找到类Foo以查看它是否有注释DoBinding。
答案 0 :(得分:0)
我不知道有什么方法可以自动完成,但你不能这样做:
static String bar=MyUtil.bindValue(this, bar);
答案 1 :(得分:0)
调用者的上下文不能通过“普通”代码获得,但您可以询问调用堆栈以找到调用该方法的类。
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
我认为您会在索引2
找到它(索引0
是当前行,1
是当前方法的详细信息)。
String className = stackTraceElements[2].getClassName();
Class<?> clazz = Class.forName(className);
答案 2 :(得分:0)
bindValue
方法实际上没有正统的方法可以找到有关其来电者的任何信息,除非它是SecurityManager
,当它可以调用getClassContext()[0]
时。但不要这样做。
好像你有点困惑。传递给bindValue
的内容没有关于声明位置的信息,所有传递的都是值。
相反,荣誉系统如何,忘记检查@DoBinding
注释并做一些事情。
或者,如果真的很重要,只需传递boolean
,其目的与@DoBinding
相同。
答案 3 :(得分:0)
我已经根据StackTrace
方法制定了一个示例。让我知道如果有什么不清楚,其他答案已经提供了一些关于为什么需要它的好信息。实施相当简单。
public class Test {
public static void main(String[] args) {
Foo f = new Foo();
System.out.println(f.x);
}
}
@Deprecated
class Foo {
static String x = StaticClass.doSomething();
}
class StaticClass {
static String doSomething(){
StackTraceElement[] trace = Thread.currentThread().getStackTrace();
String result = "";
for(int i = 0; i < trace.length; i++){
if(trace[i].getClassName().startsWith((StaticClass.class.getCanonicalName()))){
result = trace[i + 1].getClassName();
}
}
Class<?> c = null;
try {
c = Class.forName(result);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
for(Annotation s : c.getAnnotations()){
if(s.toString().contains("Deprecated")) { System.out.println("Deprecate annotation found!"); }
}
return result;
}
}
输出:
弃用发现的注释!
富