2012-10-26 71 views
-2
/** 
* this is my class, yadayada. Needs to be subclassed to be useful. 
*/ 
public abstract class MyClass { 
    ... 
    public static void myMethod() { 
    // What is the name of the subclass that's using this? 
    System.out.println("Called from class " + this.getClass().class.getName()); 
    // Doesn't work because there's no "this" in a static method. 
    } 
} 

編輯:這是我希望發生的:如何從一個子類的靜態方法獲取類?

public class FooClass extends MyClass { 
    ... 
} 

FooClass.myMethod(); // I would like this to print "Called from class FooClass" 

我所有的想法。

編輯:對於那些想知道爲什麼我這樣做的人,這實際上是Android的一個問題。

Android定義了一個名爲BroadcastReceiver的類。您將其子類化並向系統註冊您的子類。當發送適當的廣播時,系統創建你的子類的一個實例並調用它的一個方法。

我想創建自己的BroadcastReceiver子類,其中包含一個用於註冊自身的靜態方法。但我也希望它是可以分類的。它看起來有點像這樣:

/** 
* My special-purpose BroadcastReceiver. Subclass this to use it. 
*/ 
public class MyClass extends BroadcastReceiver { 
    public static scheduleAnAlarm(long when) { 
    // do some class-specific stuff 
    AlarmManager.scheduleBroadcast(MyClass.class, when); 
    } 

    public void onBroadcast() { 
    System.out.println("You should subclass MyClass for it to be useful"); 
    } 
} 

我的問題是,我想註冊的子類實例化,而不是MyClass的。

+1

對於這一切的答案'MyClass.class',他正在試圖讓不特定的子類的'class'。正如我在我的答案中指出的那樣,從靜態方法中不可能實現。 –

回答

5

你可以用」噸。那就是你不能從static方法得到class的子類。

當Java調用類的一個static方法(即使是一個是abstract),也不需要子類,因此沒有任何類加載器被加載。因此,不一定有任何子類可以獲得。即使有,也可能有多個子類,那麼Java如何決定你想要哪一個呢?

編輯,即使你編輯你不能得到的子類。有一個技巧,你可以使用異常來獲得調用類。您可以拋出/捕獲一個異常,然後沿着堆棧跟蹤走一級以獲取調用方法/類。不建議!

+0

看到我上面的修改。我創建一個子類,並從中調用該方法。但是,我可以完全相信類方法對於它們所定義的類非常困難。 –

+0

@EdwardFalk看到更新 –

+0

是的,我很害怕這一點。我正在考慮以某種方式使用反思,但是當你開始思考這些問題時,是時候開始考慮你的總體設計了。 –

0

我猜你想要的類名,然後像下面可能工作:

System.out.println("Called from class " + MyClass.class.getName()); 
+0

是的,這就是我現在正在做的事情,但是如果MyClass獲得子類,我希望此方法返回子類,而不是它定義的類。 –

+0

他正在嘗試獲取未指定子類的'class'。 –

+0

我認爲從根本上來說有一些事情在這裏出錯,1)static是CLASS特定的不是實例,那麼將這種方法編寫爲靜態來獲取子類行爲是沒有意義的。可能你需要重新考慮設計? – kosa

0

this將不能在靜態環境中工作的類實例,您可以訪問有MyClass.class

0

MyClass.class.getName()如何?

0
public class Foo extends MyClass{ 

    public static void main(String[] args) { 
     myMethod(); 
    } 
} 

public abstract class MyClass{ 

    public static void myMethod() { 

     System.out.println("Called from class " + MyClass.class.getName()); 

    } 
} 
相關問題