簡體   English   中英

getClass()和靜態方法:什么是最佳實踐?

[英]getClass() and static methods: What is the best practice?

我希望通過反思給將要使用我的代碼的程序員提供一些便利。 為了實現我想要的結果,我想獲得擴展我的代碼的類的類對象。 即使他們無法覆蓋我希望從中訪問信息的靜態方法,它也會有用。 我可能最終只是為了避免這種情況而重構設計,但是想把這個問題拋給社區。

實現這一點我知道的唯一方法是獲取當前線程,導航堆棧跟蹤,並提取類名,然后將其轉換為類的實際實例。

還有其他建議嗎?

旁注:上面的方法也是我知道獲取調用方法的唯一方法。

不幸的是,走堆棧並不一定安全:

從JDK 6 Javadoc獲取getStackTrace:

在某些情況下,某些虛擬機可能會從堆棧跟蹤中省略一個或多個堆棧幀。 在極端情況下,允許沒有關於此throwable的堆棧跟蹤信息的虛擬機從此方法返回零長度數組。 一般來說,此方法返回的數組將包含由printStackTrace打印的每個幀的一個元素。

或許,您可以使用調試器api來執行此操作。 我相信調試的東西能夠全速使用HotSpot(我可能是錯的)所以你不會看到這樣做的巨大速度。 您可以從查看: http//java.sun.com/javase/6/docs/technotes/guides/jpda/trace.html開始

此外,建立在未答復的答案...

class Base
{
    // instance method helper
    public final int foo()
    {
        return (foo(this.getClass()));
    }

    // the real helper, with access to the class
    private static int foo(final Class clazz)
    {
        return (0);
    }
}

class Child
    extends Base
{
    public void bar()
    {
        final int x;

        x = foo();
    }
}

在靜態方法中,從您的某些(任何)類擴展到堆棧的保證是什么?

如果你仔細想一想,我懷疑你會意識到你所尋找的東西是不存在的。

/編輯1 /我認為你需要的是

abstract class B {
    <T extends B> B create(Class<T> clazz) {
    ....
}

嗯。 如果createprotected方法怎么辦? 那么你可以非常肯定調用者是B ,如果調用者不能分配給B ,你甚至可以要求拋出UnsupportedOperationIllegalState

你可以使用Thread.currentThread().getStackTrace()

創建一個Throwable是非常昂貴的,所以如果經常調用你的方法(例如,每秒超過一次),不要使用它。稍微更好的方法是Thread.currentThread()。getStackTrace()。

如果您使用Sun的JVM,另一種方法是Reflection.getCallerClass(n)。 這要快得多,但不能移植到其他JVM。 如果你擔心這個,你可以有另一個方法,如果它可用則調用它,如果沒有則使用堆棧跟蹤。

所有這些都假設您的靜態方法不公開。 如果所有賭注都已關閉,因為任何類都可以調用您的方法,而不僅僅是擴展您的方法。

我建議避免反思的泥潭。 你似乎正在做一些簡單的編程。 使用簡單的實現(沒有足夠的信息來合理猜測可能是什么)。

暫無
暫無

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

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