2014-04-25 60 views
1

假設我有一個功能的基類包含靜態初始化器調用foo識別子類調用基類的靜態函數

public class Child extends Base 
{ 
    static 
    { 
     foo(); 
    } 
} 
foo

public class Base 
{ 
    protected static void foo() 
    { 
     // ToDo - what is the name of the child class calling me? 
    } 
} 

和至少一個子類

foo()是否有方法知道哪個子類調用了它?我假設有一種我可以使用的反射技術。

+1

這與識別foo調用類相同() – Franzl

+1

您正在查找的技術在[這裏](http://stackoverflow.com/q/421280/1225328)(即查找調用者) 。那就是說,你爲什麼需要知道呼叫者?如果是出於記錄目的,我確信這實際上是最好的解決方案。 – sp00m

+0

@ sp00m建議的堆棧跟蹤解決方案肯定是要走的路,但是如果真的,真的需要知道在'foo'中,也許應該將調用類或對象作爲參數傳遞給方法。 –

回答

0

最簡單的方法是傳遞一個參數。例如

public class Base { 
    protected static void foo(Class<?> type) { 
     if (type == Child.class) { 

     } 
    } 
} 

public class Child extends Base { 
    static { 
     foo(Child.class); 
    } 
} 

但是,如果你需要做一些依賴於子類那麼我建議找一個利用抽象方法和多態的解決方案。

public Base { 
    protected static void foo(Base child) { 
     child.doFoo(); 
    } 

    protected abstract void doFoo(); 
} 

public Child extends Base { 
    static { 
     foo(new Child()); 
    } 

    @Override 
    protected void doFoo() { 
     //do the child specific thing here 
    } 
} 
0

您可以通過使用getClass方法,如獲取類:

o.getClass() 

另外,如果你有一個C類,你需要檢查Ø是否是C的一個實例,可以使用instanceof,像這樣:

o instanceof c 

乾杯。

相關問題