反射

反射

1前言:
      
      
      
      
Springjdbc中使用了JdbcTemplate类,这个类在查询语句时,会有个List类型的结果,但是List类型中的元素是MapMap中的key是表的列名。当然这是Springjdbc不被很看好的原因之一,因为这太不方便了。(注:可参考Spring APIJdbcTemplate: queryForList(String sql,Object[] args)的解释)

但是,BBP项目中使用了这个JdbcTemplate,所以现在要对返回回来的List进行封装处理,要用到反射,所以,下面总结一下反射操作:

1)        在本项目中,是使用Class获取fields,然后,从fields出发,使用Method类中的invoke方法,进行赋值。

2)        而我在没有先看本项目的操作前,自己写了反射操作,是使用Class获取methods,然后,从methods出发,使用Method类中的invoke方法,进行赋值。感觉不错,说明我会使用反射了。感觉太棒了!!!

 

2. BBP项目中的反射例子可以参看:

      com.innov8tion.dao.jdbc. CategoryDAOImpl中的getCategoryList方法中的BeanUtil类。

 

3. 下面是我的反射例子的步骤:

1)        首先我写了个User对象。

2)        然后写了个测试程序,大体思想是:在Map中,keyUser对象的字段,value是自己定义的某个值。然后,使用反射来对User对象赋值。

       4. 以下贴出我的反射例子的源码:

1)        User类:

   public class User {

   private int user_id;

   private String first_name;

   private String last_name;

   private int age;

   private int status;

   private Date create_time;

  

  

   public User(){

     

   }

   public User(int user_id, String first_name, String last_name, int age, int status, Date create_time){

      setUser_id(user_id);

      setFirst_name(first_name);

      setLast_name(last_name);

      setAge(age);

      setStatus(status);

      setCreate_time(create_time);

   }

  

   public String toString(){

      return "user_id = " + getUser_id() + "/n"

           + "first_name = " + getFirst_name() + "/n"

           + "last_name = " + getLast_name() + "/n"

           + "age = " + getAge() + "/n"

           + "status = " + getStatus() + "/n"

           + "create_time = " + getCreate_time();

   }

  

   public int getUser_id() {

      return user_id;

   }

   public void setUser_id(int user_id) {

      this.user_id = user_id;

   }

   public String getFirst_name() {

      return first_name;

   }

   public void setFirst_name(String first_name) {

      this.first_name = first_name;

   }

   public String getLast_name() {

      return last_name;

   }

   public void setLast_name(String last_name) {

      this.last_name = last_name;

   }

   public int getAge() {

      return age;

   }

   public void setAge(int age) {

      this.age = age;

   }

   public int getStatus() {

      return status;

   }

   public void setStatus(int status) {

      this.status = status;

   }

   public Date getCreate_time() {

      return create_time;

   }

   public void setCreate_time(Date create_time) {

      this.create_time = create_time;

   }

  

}

2)        测试类testReflection

public class testReflection {

   public static void main(String[] args){

      Map<String, Object> map = new HashMap<String, Object>();

      map.put("user_id", 1);

      map.put("first_name", "wangle");

      map.put("last_name", "le");

      map.put("age", 23);

      map.put("status", 0);

      map.put("create_time", new Date());

     

      testReflection reflection = new testReflection();

      User user = (User)reflection.getBeanFromMap(map, User.class);

      System.out.println(user.toString());

     

   }

  

   public Object getBeanFromMap(Map<String, Object> map, Class c) {

      Object object = null;

      try{

        object = c.newInstance();

        Method[] methods = c.getDeclaredMethods();

        for(Method method : methods){

           String modifier = Modifier.toString(method.getModifiers());

           if(!modifier.contains("public")){

              continue;

           }

          

           String methodName = method.getName();

           if(!methodName.startsWith("set")){

              continue;

           }

          

           String fieldName = String.valueOf(methodName.charAt(3)).toLowerCase()

                 + methodName.substring(4);

          

           if(map.containsKey(fieldName)){

              method.invoke(object, map.get(fieldName));

           }

        }

      }catch(Exception e){

        System.out.println(e.getMessage());

      }

 

      return object;

   } 

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值