如何利用反射获得注解的名称和内部的值

使用httpclient向后端API POST数据的时候, 需要构建POST的param, 如果使用代码写的话太不优雅了, 所以考虑一种比较通用的方式实现, 详见代码, 我们使用的注解是 fastjson的, 大家可以使用其他的替换, 意思都是相通的


package zhwb.service.util;

import com.alibaba.fastjson.annotation.JSONField;
import org.apache.http.message.BasicNameValuePair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * Date: 13-12-6
 * Time: 上午11:57
 *
 * @author jack.zhang
 */
public abstract class HttpFastJsonUtils {

    private static final Logger LOG = LoggerFactory.getLogger(HttpFastJsonUtils.class);

    public static final List<BasicNameValuePair> convertBeanToBasicParam(Object jsonAnnotationBean) {
        if (jsonAnnotationBean == null) {
            throw new IllegalArgumentException("bean can not be null");
        }
        List<BasicNameValuePair> result = new ArrayList<BasicNameValuePair>();

        Field[] fields = jsonAnnotationBean.getClass().getDeclaredFields();
        for (Field field : fields) {
            if (!field.isAnnotationPresent(JSONField.class)) {  //field上是否有JsonField注解
                throw new IllegalArgumentException("annotation can only be JSONFiled type");
            }
            JSONField jsonField = field.getAnnotation(JSONField.class); //拿到field上的JsonField注解对象
            field.setAccessible(true);
            String fieldString;
            Object fieldValue = null;
            try {
                fieldValue = field.get(jsonAnnotationBean); //反射得到field的值, 注意private需要setAccessible

            } catch (IllegalAccessException e) {
                LOG.error("IllegalAccessException occur {}", e.getMessage());
            }
            if (fieldValue != null) {
                if (field.getType().equals(Date.class)) { //对一些特殊类型做处理
                    fieldString = DateUtil.formatDateToString((Date) fieldValue, "yyyy-MM-dd");
                } else {
                    fieldString = String.valueOf(fieldValue);
                }
                BasicNameValuePair basicNameValuePair = new BasicNameValuePair(jsonField.name(), fieldString);//构建httpclient需要的list
                result.add(basicNameValuePair);
            }
        }
        return result;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值