【发布时间】:2012-10-24 18:48:47
【问题描述】:
我有一个像这样的超类,它有一个工厂方法:
@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(null)来调用静态方法,谢谢madth3
【问题讨论】:
-
调用工厂方法不需要实例:stackoverflow.com/q/2467544/422353
-
一般来说,如果你使用反射,你已经把自己过度设计到了一个角落,需要考虑改变你的架构。你不能把
getClientId设为静态吗?
标签: java reflection subclass instantiation invoke