如何在Java中创建一个类的方法数组

3

你好。

我有一个用于生成数学练习的类,该类由一系列方法组成,每个方法生成一种类型的练习。

我想编写一个方法,它可以生成一个随机类型的随机练习。为此,我打算将方法名存储在数组中,并调用一个随机条目。

到目前为止没问题。

由于我将来要添加生成新练习类型的方法,因此我想知道是否有一种方法可以动态生成方法的数组:一旦加载了类,构造函数就会检查可用的方法并将其名称存储在一个数组中。

这可能吗?如果是这样,怎么做?


了解反射API - Jesper
感谢大家,特别感谢那些提出替代架构建议的人。我会尽快查看并选择最直接的答案作为采纳。此致敬礼。 - DavidTonarini
7个回答

6

您可以使用反射来查找类的方法。

但是我认为这是一种不好的架构方式。更好的处理不同练习的方法是创建一个接口IExercise,由*Exercise类来实现该接口。然后创建这些对象,将它们放入数组中并随机选择一个。然后从接口中调用指定的方法或其他操作...


3

不要存储名称,而是存储方法代理。

Method[] methods = getClass().getDeclaredMethods();

你需要仔细阅读以下内容,并忽略任何非测试代码。


3

我强烈推荐查找“策略模式”:

http://en.wikipedia.org/wiki/Strategy_pattern

你如何将其应用于你的问题?只需创建实现常见接口的对象(其中一个为您提供创建练习的方法),并使用此对象的列表。

您还将练习非常有用的模式!


2
您可以使用 反射 API 来检查可用方法。
 Method[] methods= Class.forName("ClassTo test").getDeclaredMethods();

话虽如此,在调用方法时很多事情可能会出错。

您可以通过只使用以下代码来避免这种情况:

interface  IExercise
{
    void createExercise();
}
class Exercise1 implements IExercise
{
    @Override
    public void createExercise()
    {
    }
}

然后,您可以使用IExercise[]来随机生成Exercise


可能是因为“在Java中无法在运行时生成方法”这句话有误导性,也可能是因为ClassName.class.getDeclaredMethods()更短且更不容易出错。(免责声明:不是我说的) - Jacob Raihle

1

我认为使用命令模式并将每个练习作为实现标记接口(ICommand)的命令类进行存储,这样更安全。然后,您可以使用反射在运行时检测实现ICommand接口的所有类,以获取可以运行的练习列表。这也可以避免您在随机选择代码中添加每种新类型的练习到集合中。

http://en.wikipedia.org/wiki/Command_pattern

这与下面建议的策略模式有些相似。


0

创建对象,例如:

MathExample math = new MathExample();

并将它们添加到 ArrayList<Objects>


0

我认为,最好创建责任链并将命令存储在数组中。随机选择命令并放入链中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接