簡體   English   中英

給定類成員名稱或對象,如何在Java中找到其聲明/封閉類對象?

[英]Given a class member name or object, how can I find its declaring/enclosing class object in java?

看起來像給定了Field或Element,我們可以使用getEnclosingClass或getDeclaringClass,但不能使用成員本身。 如果我們可以將一個成員變成一個領域,那么我們可以解決這個問題。 有人知道嗎

具體來說,對於以下代碼段:

@DoBinding
public Class Foo{

  static String bar=MyUtil.bindValue(bar);

.....
}

在bindValue方法中,我需要找到類Foo來查看它是否具有注釋DoBinding。

我不知道自動執行此操作的任何方法,但是您不能執行以下操作:

static String bar=MyUtil.bindValue(this, bar);

調用者的上下文無法通過“常規”代碼獲得,但是您可以查詢調用堆棧以找到調用該方法的類。

StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();

我想您會在索引2處找到它(索引0是當前行的內容,索引1是當前方法的詳細信息)。

String className = stackTraceElements[2].getClassName();
Class<?> clazz = Class.forName(className);

除非它是SecurityManager ,當它可以調用getClassContext()[0]時, bindValue方法實際上沒有發現其調用方的任何bindValue方法。 但是不要那樣做。

看來您有些困惑。 傳遞給bindValue內容沒有關於聲明它的位置的信息,傳遞的只是值。

取而代之的是榮譽系統,您無需在其中檢查@DoBinding批注,而只是做一些事情。

或者,如果確實很重要,則只需傳遞一個boolean ,其目的與@DoBinding相同。

我已經基於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;
    }
}

輸出:

棄用注解!
oo

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM