是否可以通过名称调用方法?

时间:2019-02-25 13:55:31

标签: java methods metaprogramming

我正在构建一个小型测验应用程序,并将每个问题的每个答案存储在数据库表中(使用JPA)。

我想知道是否有一种方法可以通过for循环动态获取getter(例如,使用javascript可能),而不必写出每个get方法。

我拥有的代码(其中“答案”是一个类,每个答案有9个不同的整数)。

public void parseUserScore(UserAnswers answer) {
    Integer[] answers = new Integer[] {
            answer.getQ1(),
            answer.getQ2(),
            answer.getQ3(),
            answer.getQ4(),
            answer.getQ5(),
            answer.getQ6(),
            answer.getQ7(),
            answer.getQ8(),
            answer.getQ9()
    };
    double totalscore = 0;
    Integer answeredQuestions = 0;
    for (int i = 0; i < answers.length; i++) {
        if (answers[i] > 0) {
            answeredQuestions++;
        }
        totalscore += answers[i];
    }
}

我的问题是,是否有可能像这样通过foor循环获取这些答案:

public void parseUserScore(UserAnswers answer) {
    ArrayList<Integer> list = new ArrayList<Integer>();
    for (int i = 1; i < 10; i++) {
        String methodname = "getQ" + i.toString();
        list.add(i, answer.methodname)
    }   
}

这是可取的,因为我想使用每个问题的索引根据其各自的类别将其分开。

1 个答案:

答案 0 :(得分:2)

根据您在问题中提供的内容,我认为您应该使用三个实体:UserQuestionAnswer。用户可以提出多个问题并提交多个问题答案。答案总是属于一个问题。 JPA有一些注释可以为这些规则建模:

@Entity
class User {

    @OneToMany(mappedBy = "user")
    Set<Question> questions;

    @OneToMany(mappedBy = "user")
    Set<Answer> answers;

    // Getters & setters

}

@Entity
class Question {

    @ManyToOne
    @JoinColumn(name = "user_id")
    User user;

    @OneToMany(mappedBy = "question")
    Set<Answer> answers;

    // Getters & setters

}

@Entity
class Answer {

    @ManyToOne
    @JoinColumn(name = "user_id")
    User user;

    @ManyToOne
    @JoinColumn(name = "question_id")
    Question question;

    int score;

    // Getters & setters

}

然后,您可以简单地迭代特定用户的答案并计算总得分:

final int totalScore = user.getAnswers().stream().mapToInt(Answer::getScore).sum();

请注意,这只是一个基本示例。您还应该考虑级联更新和获取关系类型。

关于您关于for循环的问题:Java提供了一个名为“ Reflection”的功能。它是元编程的一种机制,可用于实现您所描述的内容。但是,这是一个坏主意,因为它有一些缺点,并且在您的情况下没有意义,因为用户应该能够回答10个以上的问题。实际上,您不知道用户将提交多少个答案。