您的位置:首页 > 移动开发 > Objective-C

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

2013-12-06 17:49 489 查看
使用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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  object 反射