java获取实体字段描述信息

根据java反射原理获取java实体字段描述信息

首先是定义一个注解

package com.wonders.framework.annotation;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface CustomTag {
    //字段的描述注解
     String desc();
    
}

 然后写一个工具类

package com.wonders.framework.annotation;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

public class Parser {
	
	/**
	 * 通过属性取得属性的描述注解
	 * 
	 * @param field
	 * @return
	 */
	public static String getDesc(Field field) {
		String result = null;
		try {
			field.setAccessible(true);
			Annotation[] annotation = field.getAnnotations();
			for (Annotation tag : annotation) {
				if (tag instanceof CustomTag) {
					result = ((CustomTag) tag).desc();
					break;
				}
			}
		} catch (SecurityException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		}
		return result;
		// return getAnnotation(DESC, field);
		// return getAnnotation(field);
	}

	/**
	 * 通过对象和属性名称取得属性的描述注解
	 * 
	 * @param obj
	 * @param propertyName
	 * @return
	 */
	public static String getDesc(Object obj, String propertyName) {
		String result = null;
		try {
			Field[] fields = obj.getClass().getDeclaredFields();
			for (Field field : fields) {
				field.setAccessible(true);
				if (field.getName().equals(propertyName)) {
					String desc = getDesc(field);
					if (desc != null && !desc.isEmpty()) {
						result = desc;
						break;
					}
				}
			}
		} catch (SecurityException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		}
		return result;
	}

	

	/**
	 * 取得obj所有属性的描述注解,返回值为key为obj的属性名称,value为此属性的描述注解
	 * 
	 * @param obj
	 * @return
	 */
	public static Map getAllDesc(Object obj) {
		try {
			Field[] fields = obj.getClass().getDeclaredFields();
			return getResult(fields);
		} catch (SecurityException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 取得obj所有属性的描述注解,返回值为key为obj的属性名称,value为此属性的描述注解
	 * 
	 * @param obj
	 * @return
	 */
	public static Map getAllDesc(String clzName) {
		try {
			Field[] fields = Class.forName(clzName).getDeclaredFields();
			return getResult(fields);
		} catch (SecurityException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 将field[]里的字段名称做为key和字段描述做value放在map中
	 * 
	 * @param fields
	 * @param map
	 */
	private static Map getResult(Field[] fields) {
		Map result = new HashMap();
		for (Field field : fields) {
			field.setAccessible(true);
			if (field.getName().equals("id")) {
				continue;
			}
			String desc = getDesc(field);
			if (desc != null && !desc.isEmpty()) {
				result.put(field.getName(), getDesc(field));
			}
		}
		return result;
	}
	
}


调用如下

package com.wonders.framework.annotation;

import java.util.Map;

public class Person {
	@CustomTag(desc="姓名")
	private String name;
	@CustomTag(desc="性别")
	private String sec;
	@CustomTag(desc="年龄")
	private String age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSec() {
		return sec;
	}
	public void setSec(String sec) {
		this.sec = sec;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	
	public static void main(String[] args) {
		//Map map = Parser.getAllDesc("com.wonders.framework.annotation.Person");
		Map map = Parser.getAllDesc(new Person());
		for(String m : map.keySet()){
			System.out.println(m+"------"+map.get(m));
		}
		
	}
	

}

输出结果如下

sec------性别
age------年龄
name------姓名



你可能感兴趣的:(java)