2012-10-24 53 views
2

的子類,我有這樣一個超類,它有一個工廠方法:Instanciating一個抽象超

@DiscriminatorColumn(
     name = "etype", 
     discriminatorType = DiscriminatorType.STRING 
) 
public abstract class ChallengeReward { 
     public static ChallengeReward createFromFactory(String rewardType){ 
     ChallengeRewardType type = ChallengeReward.fromString(rewardType); 

     ChallengeReward challengeReward = null; 
     switch(type){ 
     case point: 
     challengeReward = new PointChallengeReward(); 
     break; 
     case notification: 
     challengeReward = new NotificationChallengeReward(); 
     break; 
     case item: 
     challengeReward = new ItemChallengeReward(); 
     break; 
     } 

     return challengeReward; 
    } 

    public String getClientId(){ 
     return "ABCDEF"; 
    } 
} 

和子類沒有構造函數本身。所以所有的挑戰獎勵都會與名爲「etype」的鑑別器列在同一個表中。

現在的問題是我想反射地調用方法getClientId(),但是我不能實例化ChallengeReward,因爲它是抽象的。所以我需要實例化它的一個子類,但是我不能做subclass.newInstance()。

我在這裏有什麼選擇?編號1: 對不起,我的問題不是很清楚。問題是我正在編寫一個通用的servlet,它將遍歷包中的所有類,因此需要反射。儘管該方法實際上是靜態的,但我不知道如何靜態調用它,因爲我只在運行時知道當前類。

編輯2: 原來,你可以調用method.invoke(空)來調用靜態方法,謝謝madth3

+1

要調用工廠方法你不需要一個實例:http://stackoverflow.com/q/2467544/422353 – madth3

+0

一般情況下,如果你使用反射,你已經過度設計自己陷入困境,需要考慮改變你的架構。你不能讓'getClientId'爲靜態的嗎? – Wug

回答

1

我想你可以通過使用類名稱本身得到method,然後調用方法如下圖所示:

 String clientId = null; 
    Class challengeRewardClass =Class.forName(ChallengeReward.class.getName()); 
    Method[] methods = challengeRewardClass.getMethods(); 
    for(Method method: methods){ 
     if(method.getName().equals("getClientId")){ 
      clientId = method.invoke(objectoToBeUsedForMethodCall, null); 
     } 
    }