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
要調用工廠方法你不需要一個實例:http://stackoverflow.com/q/2467544/422353 – madth3
一般情況下,如果你使用反射,你已經過度設計自己陷入困境,需要考慮改變你的架構。你不能讓'getClientId'爲靜態的嗎? – Wug