给定一个类成员名称或对象,如何在java中找到它的声明/封闭类对象?

时间:2013-12-13 00:16:08

标签: java

看起来给定一个Field或Element,我们可以使用getEnclosingClass或getDeclaringClass,但不能使用成员本身。如果我们可以将一个成员变成一个成员,我们可以解决这个问题。有人知道吗?

具体来说,对于以下代码段:

@DoBinding
public Class Foo{

  static String bar=MyUtil.bindValue(bar);

.....
}

在bindValue方法中,我需要找到类Foo以查看它是否有注释DoBinding。

4 个答案:

答案 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;
    }
}

输出:

  

弃用发现的注释!
  富