Java 可以按名称调用方法吗?
我正在构建一个小测验应用程序,并将每个问题的答案存储在一个数据库表中(使用JPA) 我想知道是否有一种方法可以通过for循环动态地获取getter(比如javascript),而不必写出每个get方法 我的代码(其中“answer”是一个类,每个答案有9个不同的整数)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
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();