【发布时间】:2012-08-28 06:25:09
【问题描述】:
我正在开发一个培训课程,该课程有一个 Training 课程,其函数返回一个随机方法(一种练习类型)。
这个通用类由一些特定类扩展,其中包含不同类型的练习。
然后我创建一个特定类的数组,并想随机选择一个,然后调用随机练习方法。
这是泛型类
public class TrainingClasses {
Method[] mMethods;
Random randomGenerator;
public void TraningClasses() {
randomGenerator = new Random();
/* Store methods */
mMethods= getClass().getDeclaredMethods();
}
public void RandomExercise() {
Random randGenerator = new Random();
int rnd = randGenerator.nextInt(mMethods.length);
mMethods[rnd].invoke(this);
}
这是一个具体培训班的例子
public class MatheMagic extends TrainingClasses{
public MatheMagic() {
/*Something*/
}
public String[] SomeExercise() {
/*Some code */
}
public String[] SomeOtherExercise() {
/*Some code */
}
}
在主要活动的这一点上,我想这样做:
private Object[] mTrainingClasses;
private MatheMagic mMathMag;
/*eventually other training classes*/
mMathMag = new MatheMagic();
mTrainingClasses[0] = mMathMag;
Random randGenerator = new Random();
int rnd = randGenerator.nextInt(mTrainingClasses.length);
Object aTrain = mTrainingClasses[rnd];
/*Return exercise*/
String[] mRes = aTrain.RandomExercise();
这是代码的相关部分,现在仍然不完整......但是当我尝试存储动态调用方法的结果时,由于出现类型不匹配错误,我无法继续。 可能是项目结构不对,应该改用别的架构……不过,目前还没有找到更好的办法。
感谢任何能够提供帮助的人。
––––––––––––––––––––––––––––––––––––––––––––––––––––
谢谢大家的回答。 以下是可能需要的人的最终工作代码:
/** Common interface for all exercises */
public interface Exercise {
public String[] run();
}
/** Common interface for all training classes */
public abstract class TrainingClass {
private Random rand = new Random();
public ArrayList<Exercise> mExerciseTypes = new ArrayList<Exercise>();
/** Run a random exercise */
public String[] runRandomExercise() {
int i = rand.nextInt(mExerciseTypes.size());
return mExerciseTypes.get(i).run();
}
}
/*Specific training class*/
public class MatheMagic extends TrainingClass {
public MatheMagic() {
class SomeExercise implements Exercise {
public String[] run() {
String[] mRes = new String[2];
mRes[0] = "Question type 1";
mRes[1] = "Answer type 1";
return mRes;
}
}
class SomeOtherExercise implements Exercise {
public String[] run() {
String[] mRes = new String[2];
mRes[0] = "Question type 2";
mRes[1] = "Answer type 2";
return mRes;
}
}
SomeExercise mN = new SomeExercise();
SomeOtherExercise mS = new SomeOtherExercise();
mExerciseTypes.add(mN);
mExerciseTypes.add(mS);
}
}
【问题讨论】:
-
首先,所有TrainingClass子类都应该实现一些接口,然后访问,然后不应该有任何类转换错误。
-
您可能正在尝试调用带有一些参数的方法。整个信息是什么?你能打印出错误发生时你试图调用的方法吗?
-
String[] mRes = aTrain.RandomExercise(); aTrain 是一个对象,所以如果没有演员表,我猜 RandomExercice() 的调用就无法工作
标签: java class dynamic reflection