java-接口-字段标签解析

/**
* 字段描述 用于生成给定格式文档
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({java.lang.annotation.ElementType.FIELD,java.lang.annotation.ElementType.METHOD})
public @interface FieldDescription {

public static final Class<?> NULLClazz = null;

/**
* 名称
* @return
*/
String name();
/**
* 说明
* @return
*/
String remark() default "";
/**
* 是否可空
* @return
*/
boolean nullable() default false;
/**
* 举例说明
* @return
*/
String example();

/**
* 关联枚举
* @return
*/
String refEnum() default "";

/**
* 关联枚举 获取枚举项编码的方法名称
* @return
*/
String refEnumCodeMethod() default "getCode";
/**
* 关联枚举 获取枚举项名称的方法名称
* @return
*/
String refEnumTextMethod() default "getText";
}

============================================================

public static void main(String[] args) throws InstantiationException, IllegalAccessException {

//含有字段描述标签的类列表
List<Class<?>>  clazzList = new ArrayList<Class<?>>();
clazzList.add(TargetClass.class);

for(Class<?> curClass : clazzList){
Object obj = curClass.newInstance();
DefaultValue.setDefaultValue(obj);
List<Field> fields = getAllFields(curClass);
System.out.println(curClass.getName()+":"+fields.size());
for(Field curField : fields){
if(curField.isAnnotationPresent(FieldDescription.class)){
FieldDescription fieldDesc = curField.getAnnotation(FieldDescription.class);
//设置具体值
Object fieldValue = getValue(curField.getType(),fieldDesc.example());
if(fieldValue!=null){
curField.setAccessible(true);
curField.set(obj, fieldValue);
}

String example = fieldDesc.example();
//枚举存在的情况下,自动转换为枚举值
if(fieldValue!=null && !fieldDesc.refEnum().equals("")){
try {
Class<?> refEnumClass = Class.forName(fieldDesc.refEnum());
Class<?>[] noParamClass = new Class<?>[]{ };
Object[] noParamValue = new Object[]{ };
String codeMethodName = "getCode", textMethodName = "getText";
if(!fieldDesc.refEnumCodeMethod().equals("")){
codeMethodName = fieldDesc.refEnumCodeMethod();
}
if(!fieldDesc.refEnumTextMethod().equals("")){
textMethodName = fieldDesc.refEnumTextMethod();
}
//
Method valuesMethod = refEnumClass.getMethod("values", noParamClass);
Method codeMethod = refEnumClass.getMethod(codeMethodName, noParamClass);
Method textMethod = refEnumClass.getMethod(textMethodName, noParamClass);
Object[] items = (Object[])valuesMethod.invoke(refEnumClass, noParamValue);
String[][] itemsValue = new String[items.length][2];
for(int i=0;i<items.length;i++){
Object curItem = items[i];
itemsValue[i][0] = String.valueOf(codeMethod.invoke(curItem, noParamValue));
itemsValue[i][1] = String.valueOf(textMethod.invoke(curItem, noParamValue));
if(example.equals(itemsValue[i][0])){
example +=":" + itemsValue[i][1];
}
}
example +="[";
for(int i=0;i<items.length;i++){
example += itemsValue[i][0]+":"+itemsValue[i][1]+" ";
}
example +="]";

} catch (Exception e) {
System.err.println("没找到枚举:"+e.getLocalizedMessage());
e.printStackTrace();
}
}

//
System.out.println(curField.getName()+"\t"+curField.getType().getSimpleName()+"\t"+fieldDesc.name()
+"\t"+fieldDesc.remark()+" "+example+"\t"+(fieldDesc.nullable() ?"否":"是"));
}
}
System.out.println(JsonUtils.toJson(obj));
}

}

private static Object getValue(Class<?> clazz,String val){
Object result = null;
if(String.class.equals(clazz) || val==null || val.trim().equals("")){
return val;
}
if(int.class.equals(clazz) || Integer.class.equals(clazz)){
result = Integer.valueOf(val);
result = result == null ? 0 : result;
return result;
}
if(long.class.equals(clazz) || Long.class.equals(clazz)){
result = Long.valueOf(val);
result = result == null ? 0l : result;
return result;
}
if(double.class.equals(clazz) || Double.class.equals(clazz)){
result = Double.valueOf(val);
result = result == null ? 0.0d: result;
return result;
}
if(float.class.equals(clazz) || Float.class.equals(clazz)){
result = Float.valueOf(val);
result = result == null ? 0.0f : result;
return result;
}
if(short.class.equals(clazz) || Short.class.equals(clazz)){
result = Short.valueOf(val);
result = result == null ? (short)0 : result;
return result;
}
if(byte.class.equals(clazz) || Byte.class.equals(clazz)){
result = Byte.valueOf(val);
result = result == null ? (byte)0 : result;
return result;
}
if(boolean.class.equals(clazz) || Boolean.class.equals(clazz)){
result = Boolean.valueOf(val);
result = result == null ? false : result;
return result;
}
if(Date.class.equals(clazz)){
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
result = df.parseObject(val);
} catch (ParseException e) {
}
result = result == null ? new Date() : result;
return result;
}
return result;
}

private static List<Field> getAllFields(Class<?> src){
List<Field> result = new ArrayList<Field>();
if(src==null) return result;
while(true){
result.addAll(Arrays.asList(src.getDeclaredFields()));
src = src.getSuperclass();
if(src==null) break;
}
return result;
}

 

posted @ 2014-12-24 15:11  只有肥胖的厚度  阅读(294)  评论(0编辑  收藏  举报