2016-01-08 36 views
-1

從來就得到了一個超Token一些子像KnightKingQueen的java:調用來自未知類的靜態方法與polymorphy

我需要一個隨機Token類型,因此我把這個方法:

public Class randomTokenType(){ 
    Class[] classes ={ Bishop.class, King.class, Knight.class, Pawn.class, Queen.class, Rook.class }; 
    Random random = new Random(); 
    return classes[random.nextInt(6)]; 
} 

Class<Token> tokenType = randomTokenType(); 

現在我想呼籲這tokenType一個靜態方法,例如:

tokenType.displayString() 

編譯器無法解決此方法,即使在Token及其所有子類中實施它也很難。

什麼是我的錯?

+0

你認爲的'Class'類是什麼?你爲什麼這麼認爲? Java中的多態性和「靜態」是矛盾的。 –

+0

另外,請不要爲Java代碼添加JavaScript代碼段。看看幫助中心如何正確發佈代碼片段。 –

+0

在Java中的新對不起。通常我在Smalltalk中編碼,甚至類都是對象。 「類」和「對象」之間的行爲沒有任何區別 – jesper

回答

1

你實際上是在尋找什麼是反思 - 見Invoking a static method using reflection

在你的情況下,這將是:

Method method = tokenType.getMethod("displayString"); 
method.invoke(null); 

A類對象是一種索引。它包含的方法允許您查詢實際.class文件包含的內容(如其方法,字段,註釋等)。

你不能直接訪問它們(如索引僅指向該信息所在 - 而不是信息本身) - 而不是你需要查詢與IE Class.getMethod指數(「nameofMethod」)

一旦你獲得了可以嘗試調用它的方法的「指針」(通過Method.invoke)。

取決於它是什麼類型的方法,你只需要傳遞invoke方法只有null(對於靜態方法)或對象的實例(對於非靜態的)。

反射允許您即時創建這樣一個實例。

欲瞭解更多信息,我建議閱讀反思,尤其是類的javadoc。它解釋了很多。

編輯:如果方法displayString聲明如下這僅適用於:

public class Bishop{ 
    public static void displayString() { 
     System.out.println("Bishop"); 
    } 
} 

public class Test { 
public static void main(String args[]) throws Exception { 
    Class<?> tokenType = Bishop.class; 
    Method method = tokenType.getMethod("displayString"); 
    method.invoke(null); 
} 
} 

如果有參數,或者是私有的,那麼這將無法工作

+0

已經嘗試過。我得到一個NoSuchMethodException。與'.getDeclaredMethod' – jesper

+0

相同,問題是該方法是否公開。我只是試了一下: public class Bishop { \t public static void displayString(){ \t \t System.out.println(「Bishop」); \t} } – Niko

0

有不少問題你的代碼。他們中幾乎沒有一個是

  • 您正在要求一個類來返回一些東西。

    public class randomTokenType() //不知道這應該是什麼意思?

  • 如果添加靜態的方法定義,方法永遠無法overrriden