实际开发中,数据库往往会有冗余,因为数据量巨大,为了避免表间过多的关联,使查询效率降低!采用恒表是一个不错的选择
而恒表就往往有很多字段,一般字段间还有规律可循,那么,我们从实际环境总采集到的数据,如何向恒表对应的类的属性进行赋
值呢?巨量的属性 不可能挨个赋值,所以基于恒表对应类的属性赋值可行性需要研究
我尝试很多方法,但是都失败了,后来采用的反射进行赋值,发现这个是一个不错想法,现在写下来给大家分享:
假若有一个多的类:ExamResult 是对应试卷题目的信息的考试结果的一个实例类
假设属性为:Class ExamResult{
private int question1Id;
private int question1Score;
... ... //中间ID198个属性
... ... //中间Score198个属性
private int question200Id;
private int question200Score;
}
那个我们将学生的考试结果数据采集到了,如何给这个类的400个属性赋值呢?很显然挨个赋值是非常不现实和笨拙的方法
下面采用反射方法赋值:
主要思路是:遍历问题,依据问题的ID来拼成字符串:setQuestion+i+Id,setQuestion+i+Score
然后对ExamResult进行反射 Method[] methods = examResult.getClass().getMethods();
循环比较setQuestion+i+Id,setQuestion+i+Score methods[j].getName();
相同进行赋值
下面是实现简要代码:
for (int i = 0; i < questions.size(); i++) {
for(int j=0;j<methods.length;j++){
String str = "setQuestion"+(i+1)+"Id"; //第i+1个属性的set方法
String str_1 = "setQuestion"+(i+1)+"Score";
if(str.equals(methods[j].getName())){
System.out.println(str);
System.out.println(methods[j].getName());
//对examResult的属性进行赋值 将序列号为i的questions的ID赋给examResult
try {
methods[j].invoke(examResult, new Object[]{Long.parseLong(questions.get(i).getId())});
} catch (Exception e) {
e.printStackTrace();
}
}
if(str_1.equals(methods[j].getName())){
if (!questions.get(i).getAnswer().equals(answers.get(i))) {
//当问题的答案不一致时
total = total - score;
try {
methods[j].invoke(examResult, new Object[]{new Long(0)});
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//要如何赋给 ExamResult的属性?
//examResult.setQ+i+""+Id(questions.get(i).getId());
//score 在此处存储学生的成绩信息
//存入context
}else{
//当问题的答案和问题的答案一致时
try {
methods[j].invoke(examResult, new Object[]{new Long(score)});
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
相对比挨个赋值,这个代码量少了很多!不错的解决方法~~