java 反射机制的应用

因为有两个接口返回的数据不是一致的,所以数据库表的创建是集合了这二者接口返回数据的并集,当从其中某一个接口取的数据时,不想每个字段都去set一下,所以有了以下的处理:

将针对这两个接口返回数据并集创建A数据库表,对应项目中的A类。

根据第一个接口(B)获取的数据,创建了项目中的AFromB类

A.java


import com.coocaa.base.AbstractItem;
import com.coocaa.base.ItemBase;
import com.coocaa.db.distributed.Level;

import javax.persistence.*;


@Entity
@Table(name = "table_name")
@Level(Level.TYPE.PRIVATE)
@org.hibernate.annotations.Entity(dynamicUpdate=true,dynamicInsert=true)
public class A extends AbstractItem implements ItemBase {
   /**
    *
    */
   private static final long serialVersionUID = 1L;

   public A(){}

   @Column( name = "id" , nullable=false ,length = 8)
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Integer id;

   @Column( name = "dev_mac" ,length = 100 )
   private String devMac;

   @Column( name = "chip" ,length = 100 )
   private String chip;
  
   public void setId( Integer id ) {
      this.id = id;
   }
   public Integer getId() {
      return this.id;
   }
   public void setDevMac( String devMac ) {
      this.devMac = devMac;
   }
   public String getDevMac() {
      return this.devMac;
   }
   public void setChip( String chip ) {
      this.chip = chip;
   }
   public String getChip() {
      return this.chip;
   }

}

AFromB类:


package com.coocaa.app.device;

import javax.persistence.Column;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class AFromB{

   private String dev_mac;

   private String chip;

   
   public String getDev_mac() {
      return dev_mac;
   }

   public void setDev_mac(String dev_mac) {
      this.dev_mac = dev_mac;
   }

  

   public A toA() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException{
      Class<?>  aFromBClass = AFromB.class;
      Class<?> aClass = A.class;
      Field[] fields = a.getDeclaredFields();

      A a= new A();

      for (Field field : fields) {
         Column column = field.getAnnotation(Column.class);//获取注解
         if (column==null){
            continue;
         }
         Field fieldAFromB = null;
         try {
            fieldAFromB = aFromBClass.getDeclaredField(column.name());//获取带注解的name  比如获取的dev_mac而不是devMac
         } catch (NoSuchFieldException e) {
            //e.printStackTrace();
            continue;
         }
         if (fieldAFromB!=null){
            //aFromB拿出来
              String aFromBMethodName =fieldAFromB.getName().substring(0, 1).toUpperCase()+fieldAFromB.getName().substring(1);
            String getMethodName = "get"+aFromBMethodName;
            Method getMethod =  aFromBClass.getMethod(getMethodName);

            //setalass这里面去
             String aMethodName = field.getName().substring(0, 1).toUpperCase()+field.getName().substring(1);
            String setMethodName = "set"+devicMethodName;
            Method setMethod =  aClass.getMethod(setMethodName,field.getType());

            Object value = getMethod.invoke(this);
            setMethod.invoke(a,value);
         }

      }

      return a;
   }
}


去接口获取时只需做如下操作:

AFromB aFromB = JacksonHelper.fromJSON(respone, AFromB .class);//AFromB里面的属性必须和返回的Json的名称一致,所以AFromB里面的属性都是小写的
A a= aFromB.toA();

这样就从把从B接口获取的获取直接 Set到A中,不用每个字段都去set,代码更加简洁 。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值