A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始


假设有这么一个数据库表,用来记录一个月内每天的温度。又有一个名为MonthTemp的类,有30个属性,分别是day1,day2,day3,day4...一直到day30。
然后从表内取出1条记录,将它存在一个list内。请问为monthTemp的每一个属性赋值呢?
当然,简单但是麻烦的普通解决思路不是没有。我大可以写30条set,一个个把值存进去。问题是这样写起花时间,还容易写错。于是我准备文艺一点,使用反射。
首先,先建一个MonthTemp的类,为其加上30个属性。
  1. package refi;

  2. public class MonthTemp {
  3.         private int day1=0;
  4.         private int day2=0;
  5.         private int day3=0;
  6.         private int day4=0;
  7.         private int day5=0;
  8.         private int day6=0;
  9.         private int day7=0;
  10.         private int day8=0;
  11.         private int day9=0;
  12.         private int day10=0;
  13.         private int day11=0;
  14.         private int day12=0;
  15.         private int day13=0;
  16.         private int day14=0;
  17.         private int day15=0;
  18.         private int day16=0;
  19.         private int day17=0;
  20.         private int day18=0;
  21.         private int day19=0;
  22.         private int day20=0;
  23.         private int day21=0;
  24.         private int day22=0;
  25.         private int day23=0;
  26.         private int day24=0;
  27.         private int day25=0;
  28.         private int day26=0;
  29.         private int day27=0;
  30.         private int day28=0;
  31.         private int day29=0;
  32.         private int day30=0;
  33.         public int getDay1() {
  34.                 return day1;
  35.         }
  36.         public void setDay1(int day1) {
  37.                 this.day1 = day1;
  38.         }
  39.         public int getDay2() {
  40.                 return day2;
  41.         }
  42.         public void setDay2(int day2) {
  43.                 this.day2 = day2;
  44.         }
  45.         public int getDay3() {
  46.                 return day3;
  47.         }
  48.         public void setDay3(int day3) {
  49.                 this.day3 = day3;
  50.         }
  51.         public int getDay4() {
  52.                 return day4;
  53.         }
  54.         public void setDay4(int day4) {
  55.                 this.day4 = day4;
  56.         }
  57.         public int getDay5() {
  58.                 return day5;
  59.         }
  60.         public void setDay5(int day5) {
  61.                 this.day5 = day5;
  62.         }
  63.         public int getDay6() {
  64.                 return day6;
  65.         }
  66.         public void setDay6(int day6) {
  67.                 this.day6 = day6;
  68.         }
  69.         public int getDay7() {
  70.                 return day7;
  71.         }
  72.         public void setDay7(int day7) {
  73.                 this.day7 = day7;
  74.         }
  75.         public int getDay8() {
  76.                 return day8;
  77.         }
  78.         public void setDay8(int day8) {
  79.                 this.day8 = day8;
  80.         }
  81.         public int getDay9() {
  82.                 return day9;
  83.         }
  84.         public void setDay9(int day9) {
  85.                 this.day9 = day9;
  86.         }
  87.         public int getDay10() {
  88.                 return day10;
  89.         }
  90.         public void setDay10(int day10) {
  91.                 this.day10 = day10;
  92.         }
  93.         public int getDay11() {
  94.                 return day11;
  95.         }
  96.         public void setDay11(int day11) {
  97.                 this.day11 = day11;
  98.         }
  99.         public int getDay12() {
  100.                 return day12;
  101.         }
  102.         public void setDay12(int day12) {
  103.                 this.day12 = day12;
  104.         }
  105.         public int getDay13() {
  106.                 return day13;
  107.         }
  108.         public void setDay13(int day13) {
  109.                 this.day13 = day13;
  110.         }
  111.         public int getDay14() {
  112.                 return day14;
  113.         }
  114.         public void setDay14(int day14) {
  115.                 this.day14 = day14;
  116.         }
  117.         public int getDay15() {
  118.                 return day15;
  119.         }
  120.         public void setDay15(int day15) {
  121.                 this.day15 = day15;
  122.         }
  123.         public int getDay16() {
  124.                 return day16;
  125.         }
  126.         public void setDay16(int day16) {
  127.                 this.day16 = day16;
  128.         }
  129.         public int getDay17() {
  130.                 return day17;
  131.         }
  132.         public void setDay17(int day17) {
  133.                 this.day17 = day17;
  134.         }
  135.         public int getDay18() {
  136.                 return day18;
  137.         }
  138.         public void setDay18(int day18) {
  139.                 this.day18 = day18;
  140.         }
  141.         public int getDay19() {
  142.                 return day19;
  143.         }
  144.         public void setDay19(int day19) {
  145.                 this.day19 = day19;
  146.         }
  147.         public int getDay20() {
  148.                 return day20;
  149.         }
  150.         public void setDay20(int day20) {
  151.                 this.day20 = day20;
  152.         }
  153.         public int getDay21() {
  154.                 return day21;
  155.         }
  156.         public void setDay21(int day21) {
  157.                 this.day21 = day21;
  158.         }
  159.         public int getDay22() {
  160.                 return day22;
  161.         }
  162.         public void setDay22(int day22) {
  163.                 this.day22 = day22;
  164.         }
  165.         public int getDay23() {
  166.                 return day23;
  167.         }
  168.         public void setDay23(int day23) {
  169.                 this.day23 = day23;
  170.         }
  171.         public int getDay24() {
  172.                 return day24;
  173.         }
  174.         public void setDay24(int day24) {
  175.                 this.day24 = day24;
  176.         }
  177.         public int getDay25() {
  178.                 return day25;
  179.         }
  180.         public void setDay25(int day25) {
  181.                 this.day25 = day25;
  182.         }
  183.         public int getDay26() {
  184.                 return day26;
  185.         }
  186.         public void setDay26(int day26) {
  187.                 this.day26 = day26;
  188.         }
  189.         public int getDay27() {
  190.                 return day27;
  191.         }
  192.         public void setDay27(int day27) {
  193.                 this.day27 = day27;
  194.         }
  195.         public int getDay28() {
  196.                 return day28;
  197.         }
  198.         public void setDay28(int day28) {
  199.                 this.day28 = day28;
  200.         }
  201.         public int getDay29() {
  202.                 return day29;
  203.         }
  204.         public void setDay29(int day29) {
  205.                 this.day29 = day29;
  206.         }
  207.         public int getDay30() {
  208.                 return day30;
  209.         }
  210.         public void setDay30(int day30) {
  211.                 this.day30 = day30;
  212.         }
  213. }
复制代码
当然按照我的性格,让我一个个敲这30个属性,那是做梦。于是在建立MonthTemp之前,我先写了一个偷懒的类。
  1. package refi;

  2. public class CreateMonth {
  3.         public static void main(String[] args) {
  4.                 for(int i=0;i<30;i++){
  5.                         System.out.println("private int day"+(i+1)+"=0;");
  6.                 }
  7. }
  8. }
复制代码
运行,复制粘贴,搞定。
然后我创建了一个MonthTempMethods,用2个Map来保存MonthTemp的get和set方法。同时我取方法getDay1()的缩略day1为字符串,作为getDay方法的映射值扔进map中。这样我可以通过day1直接在map中寻找到getDay1()方法。

  1. package refi;

  2. import java.lang.reflect.Method;
  3. import java.util.Hashtable;
  4. import java.util.regex.Pattern;

  5. public class MonthTempMethods {
  6.          static Class cls;
  7.             //用map保存标签tag和对应的方法
  8.             public static Hashtable<String,Method> getMethods= null;
  9.             public static Hashtable<String,Method> setMethods= null;
  10.             public static  void init(){

  11.                 getMethods = new Hashtable<String, Method>();
  12.                 setMethods = new Hashtable<String, Method>();
  13.                 cls = MonthTemp.class;
  14.                 
  15.                 Method methods[] = cls.getMethods();
  16.                 
  17.                 //定义正则表达式,只保留get和set方法
  18.                 String gs = "get(\\w+)";
  19.                 Pattern getM = Pattern.compile(gs);
  20.                 String ss ="set(\\w+)";
  21.                 Pattern setM = Pattern.compile(ss);
  22.                 String temp = "$1";
  23.                 String tag="";
  24.                 
  25.                 for(int i = 0; i < methods.length; ++i) {
  26.                         //获取方法
  27.                     Method m = methods[i];
  28.                     //获取方法名
  29.                     String methodName = m.getName();
  30.                     if (Pattern.matches(gs, methodName )) {//如果是get系方法就保存在get的Map里
  31.                        tag = getM.matcher(methodName).replaceAll(temp).toLowerCase();
  32.                        getMethods.put(tag, m);
  33.                     }else {//否则就保存在set方法里
  34.                        tag = setM.matcher(methodName).replaceAll(temp).toLowerCase();
  35.                        setMethods.put(tag, m);
  36.                     }
  37.                    
  38.                 }
  39.             }
  40. }
复制代码

然后我编写测试类Demo
  1. package refi;
  2. import java.lang.reflect.InvocationTargetException;
  3. import java.lang.reflect.Method;
  4. import java.util.ArrayList;
  5. import java.util.List;

  6. public class Demo {
  7.         public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
  8.                
  9.                 //初始化数组
  10.                 List<Integer> temp=new ArrayList<Integer>();
  11.                 for(int i=0;i<30;i++){
  12.                         temp.add((int) (Math.random()*20+10));
  13.                 }
  14.                
  15.                 //初始化MonthTemp里的get和set方法
  16.                 MonthTempMethods.init();
  17.                
  18.                 //实例化一个MonthTemp
  19.                 MonthTemp mt =new MonthTemp();
  20.                
  21.                 //赋值
  22.                 for(int i=0;i<temp.size();i++){
  23.                         String tag="day"+(i+1);
  24.                         Method m=MonthTempMethods.setMethods.get(tag);
  25.                          m.invoke(mt,temp.get(i));
  26.                 }
  27.                
  28.                 //输出
  29.                 for(int i=0;i<30;i++){
  30.                         String tag="day"+(i+1);
  31.                         Method m=MonthTempMethods.getMethods.get(tag);
  32.                         System.out.println("第"+(i+1)+"天的温度是:"+m.invoke(mt));
  33.                        
  34.                 }
  35. }
  36. }
复制代码

运行后如图:

顺利完成。

写在最后的废话:
其实这么一看,我写的代码比不写30次get和set多(于是2B的内核再次暴露了出来)。但是这么写有一个巨大的优势,以后如果我再取出一条MonthTemp数据来进行处理,就可以直接调用MonthTempMethods的方法了。MonthTemp在不同的程序中使用的越多,反射的优势就越大。




0 个回复

您需要登录后才可以回帖 登录 | 加入黑马