Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可以按名称调用方法吗?_Java_Methods_Metaprogramming - Fatal编程技术网

Java 可以按名称调用方法吗?

Java 可以按名称调用方法吗?,java,methods,metaprogramming,Java,Methods,Metaprogramming,我正在构建一个小测验应用程序,并将每个问题的答案存储在一个数据库表中(使用JPA) 我想知道是否有一种方法可以通过for循环动态地获取getter(比如javascript),而不必写出每个get方法 我的代码(其中“answer”是一个类,每个答案有9个不同的整数) public void parseUserScore(UserAnswers-answer){ 整数[]答案=新整数[]{ answer.getQ1(), 答案:getQ2(), answer.getQ3(), answer.ge

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

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

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

public void parseUserScore(UserAnswers-answer){
整数[]答案=新整数[]{
answer.getQ1(),
答案:getQ2(),
answer.getQ3(),
answer.getQ4(),
answer.getQ5(),
answer.getQ6(),
answer.getQ7(),
答案:getQ8(),
答案:getQ9()
};
双倍总分=0;
整数回答问题=0;
for(int i=0;i0){
回答问题++;
}
总分+=答案[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)
    }   
}
public void parseUserScore(UserAnswers-answer){
ArrayList=新建ArrayList();
对于(int i=1;i<10;i++){
String methodname=“getQ”+i.toString();
list.add(i,answer.methodname)
}   
}

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

根据您在问题中提供的内容,我认为您应该使用三个实体:
用户
问题
答案
。用户可以提出多个问题并提交多个问题答案。答案总是属于一个问题。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

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


关于for循环的问题:Java提供了一个称为“反射”的特性。它是一种元编程机制,可用于实现您所描述的功能。然而,这是一个坏主意,因为它有一些缺点,在您的情况下没有任何意义,因为用户应该能够回答10个以上的问题。事实上,您无法知道用户将提交多少答案。

为什么
UserAnswers
不维护一个
列表答案
?不,因为您的答案不在数组或列表中。您可以使用反射,但这对设计问题来说是一个糟糕的解决方案。。。你做错了什么。然后,您必须后退一步,找出如何组织数据/代码以使用列表/数组。对于问题,最好使用数组,但我无法使用JPA将各个列映射到JPA中的数组。所以我必须将每一列映射到一个单独的整数…是的,我本打算发布一个带有反射的答案,并尝试阻止OP使用它(通过像你那样做),但现在你发布了这个,我只想给你投票。但是,您应该添加为什么反射不是一个好主意(即使它在评论中)。
@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();