假设有这么一个数据库表,用来记录一个月内每天的温度。又有一个名为MonthTemp的类,有30个属性,分别是day1,day2,day3,day4...一直到day30。
然后从表内取出1条记录,将它存在一个list内。请问为monthTemp的每一个属性赋值呢?
当然,简单但是麻烦的普通解决思路不是没有。我大可以写30条set,一个个把值存进去。问题是这样写起花时间,还容易写错。于是我准备文艺一点,使用反射。
首先,先建一个MonthTemp的类,为其加上30个属性。
当然按照我的性格,让我一个个敲这30个属性,那是做梦。于是在建立MonthTemp之前,我先写了一个偷懒的类。
- package refi;
- public class CreateMonth {
- public static void main(String[] args) {
- for(int i=0;i<30;i++){
- System.out.println("private int day"+(i+1)+"=0;");
- }
- }
- }
复制代码 运行,复制粘贴,搞定。
然后我创建了一个MonthTempMethods,用2个Map来保存MonthTemp的get和set方法。同时我取方法getDay1()的缩略day1为字符串,作为getDay方法的映射值扔进map中。这样我可以通过day1直接在map中寻找到getDay1()方法。
- package refi;
- import java.lang.reflect.Method;
- import java.util.Hashtable;
- import java.util.regex.Pattern;
- public class MonthTempMethods {
- static Class cls;
- //用map保存标签tag和对应的方法
- public static Hashtable<String,Method> getMethods= null;
- public static Hashtable<String,Method> setMethods= null;
- public static void init(){
- getMethods = new Hashtable<String, Method>();
- setMethods = new Hashtable<String, Method>();
- cls = MonthTemp.class;
-
- Method methods[] = cls.getMethods();
-
- //定义正则表达式,只保留get和set方法
- String gs = "get(\\w+)";
- Pattern getM = Pattern.compile(gs);
- String ss ="set(\\w+)";
- Pattern setM = Pattern.compile(ss);
- String temp = "$1";
- String tag="";
-
- for(int i = 0; i < methods.length; ++i) {
- //获取方法
- Method m = methods[i];
- //获取方法名
- String methodName = m.getName();
- if (Pattern.matches(gs, methodName )) {//如果是get系方法就保存在get的Map里
- tag = getM.matcher(methodName).replaceAll(temp).toLowerCase();
- getMethods.put(tag, m);
- }else {//否则就保存在set方法里
- tag = setM.matcher(methodName).replaceAll(temp).toLowerCase();
- setMethods.put(tag, m);
- }
-
- }
- }
- }
复制代码
然后我编写测试类Demo
- package refi;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import java.util.ArrayList;
- import java.util.List;
- public class Demo {
- public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
-
- //初始化数组
- List<Integer> temp=new ArrayList<Integer>();
- for(int i=0;i<30;i++){
- temp.add((int) (Math.random()*20+10));
- }
-
- //初始化MonthTemp里的get和set方法
- MonthTempMethods.init();
-
- //实例化一个MonthTemp
- MonthTemp mt =new MonthTemp();
-
- //赋值
- for(int i=0;i<temp.size();i++){
- String tag="day"+(i+1);
- Method m=MonthTempMethods.setMethods.get(tag);
- m.invoke(mt,temp.get(i));
- }
-
- //输出
- for(int i=0;i<30;i++){
- String tag="day"+(i+1);
- Method m=MonthTempMethods.getMethods.get(tag);
- System.out.println("第"+(i+1)+"天的温度是:"+m.invoke(mt));
-
- }
- }
- }
复制代码
运行后如图:
顺利完成。
写在最后的废话:
其实这么一看,我写的代码比不写30次get和set多(于是2B的内核再次暴露了出来)。但是这么写有一个巨大的优势,以后如果我再取出一条MonthTemp数据来进行处理,就可以直接调用MonthTempMethods的方法了。MonthTemp在不同的程序中使用的越多,反射的优势就越大。
|
|