DEFieldCacheMap.java 7.0 KB
Newer Older
1 2 3
package cn.ibizlab.util.helper;


4
import cn.ibizlab.util.annotation.Audit;
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
import cn.ibizlab.util.annotation.DEField;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;

/**
 * 实体对象属性缓存类
 */
public class DEFieldCacheMap {

	private static Hashtable<String, Hashtable<String,Field>> cacheMap = new Hashtable<>();

	private static Hashtable<String, List<Field>> cacheList = new Hashtable<>();

	private static Hashtable<String, Hashtable<String,String>> cacheKey = new Hashtable<>();

	private static Hashtable<String, Hashtable<String,DEField>> cacheDEField = new Hashtable<>();

26 27
	private static Hashtable<String, Hashtable<String,Audit>> cacheAuditField = new Hashtable<>();

28 29 30 31 32 33 34 35 36 37 38
	private static Hashtable<String, String> cacheDEKeyField = new Hashtable<>();

	private static Object objLock1=new Object();

	/**
	 * 将实体对象中的属性存入缓存中
	 * @param
	 * @return
	 */
	public static <T> Hashtable<String,Field> getFieldMap(Class<T> clazz) {
		String className=clazz.getName();
39 40 41 42 43 44
		if(className.indexOf("_$")>0) {
        	className=className.substring(0, className.lastIndexOf("_$"));
		}
		if(cacheMap.containsKey(className)) {
        	return cacheMap.get(className);
		}
45
		synchronized (objLock1) {
46 47 48
			if(cacheMap.containsKey(className)) {
        	   return cacheMap.get(className);
			}
49 50 51 52
			Hashtable<String,Field> result = new Hashtable<String,Field>();
			List<Field> list=new ArrayList<Field>();
			Hashtable<String,String> keys=new Hashtable<String,String>();
			Hashtable<String,DEField> defields=new Hashtable<>();
53
			Hashtable<String, Audit> auditfields=new Hashtable<>();
54 55 56 57 58 59 60
			Hashtable<String,String> dekeyfields=new Hashtable<>();
			Field[] fields=clazz.getDeclaredFields();
			for(Field field:fields){
				result.put(field.getName(),field);
				list.add(field);
				keys.put(field.getName().toLowerCase(),field.getName());
				DEField deField=field.getAnnotation(DEField.class);
61
				Audit auditField=field.getAnnotation(Audit.class);
62 63
				if(!ObjectUtils.isEmpty(deField)) {
					defields.put(field.getName(),deField);
64 65 66
					if(deField.isKeyField()) {
            			cacheDEKeyField.put(className,field.getName());
					}
67
				}
68 69 70
				if(!ObjectUtils.isEmpty(auditField)) {
					auditfields.put(field.getName(),auditField);
				}
71 72 73 74 75
			}
			cacheMap.put(className, result);
			cacheList.put(className,list);
			cacheKey.put(className,keys);
			cacheDEField.put(className,defields);
76
			cacheAuditField.put(className,auditfields);
77 78 79 80
			return result;
		}
	}
	public static Hashtable<String,Field> getFieldMap(String className) {
81 82 83 84 85 86
		if(className.indexOf("_$")>0) {
            className=className.substring(0, className.lastIndexOf("_$"));
		}
		if(cacheMap.containsKey(className)) {
            return cacheMap.get(className);
		}
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
		Class clazz = null;
		try {
			clazz = Class.forName(className);
			return getFieldMap(clazz);
		}
		catch (Exception ex) {
			cacheMap.put(className, new Hashtable<String,Field>());
			return cacheMap.get(className);
		}
	}

	/**
	 * 从缓存中查询实体对象属性集合
	 * @param
	 * @return
	 */
	public static <T> Hashtable<String,DEField> getDEFields(Class<T> clazz) {
		String className=clazz.getName();
105
		if(className.indexOf("_$")>0) {
106
			className=className.substring(0, className.lastIndexOf("_$"));
107 108
		}
		if(cacheDEField.containsKey(className)) {
109
			return cacheDEField.get(className);
110
		}
111
		else{
112
			DEFieldCacheMap.getFieldMap(className);
113 114 115 116
			return cacheDEField.get(className);
		}
	}

117 118 119 120 121 122 123
	/**
	 * 从缓存中查询审计属性集合
	 * @param
	 * @return
	 */
	public static <T> Hashtable<String,Audit> getAuditFields(Class<T> clazz) {
		String className=clazz.getName();
124
		if(className.indexOf("_$")>0) {
125
			className=className.substring(0, className.lastIndexOf("_$"));
126 127
		}
		if(cacheAuditField.containsKey(className)) {
128
			return cacheAuditField.get(className);
129
		}
130 131 132 133 134 135
		else{
			DEFieldCacheMap.getFieldMap(className);
			return cacheAuditField.get(className);
		}
	}

136 137 138 139 140 141 142
	/**
	 * 从缓存中查询实体对象主键
	 * @param
	 * @return
	 */
	public static <T> String getDEKeyField(Class<T> clazz) {
		String className=clazz.getName();
143
		if(className.indexOf("_$")>0) {
144
			className=className.substring(0, className.lastIndexOf("_$"));
145 146
		}
		if(cacheDEKeyField.containsKey(className)) {
147
			return cacheDEKeyField.get(className);
148
		}
149
		else{
150
			DEFieldCacheMap.getFieldMap(className);
151 152 153 154 155 156 157 158 159 160 161 162
			return cacheDEKeyField.get(className);
		}
	}


	/**
	 * 从缓存中查询实体对象属性列表
	 * @param
	 * @return
	 */
	public static <T> List<Field> getFields(Class<T> clazz) {
		String className=clazz.getName();
163
		if(className.indexOf("_$")>0) {
164
			className=className.substring(0, className.lastIndexOf("_$"));
165 166
		}
		if(cacheList.containsKey(className)) {
167
			return cacheList.get(className);
168
		}
169
		else{
170
			DEFieldCacheMap.getFieldMap(className);
171 172 173 174 175
			return cacheList.get(className);
		}
	}

	public static List<Field> getFields(String className) {
176
		if(className.indexOf("_$")>0) {
177
			className=className.substring(0, className.lastIndexOf("_$"));
178 179
		}
		if(cacheList.containsKey(className)) {
180
			return cacheList.get(className);
181
		}
182 183 184 185 186 187 188 189 190 191 192 193 194
		else{
			DEFieldCacheMap.getFieldMap(className);
			return cacheList.get(className);
		}
	}

	/**
	 * 从缓存中查询实体对象属性列表
	 * @param
	 * @return
	 */
	public static <T> Hashtable<String,String> getFieldKeys(Class<T> clazz) {
		String className=clazz.getName();
195
		if(className.indexOf("_$")>0) {
196
			className=className.substring(0, className.lastIndexOf("_$"));
197 198
		}
		if(cacheKey.containsKey(className)) {
199
			return cacheKey.get(className);
200
		}
201
		else{
202
			DEFieldCacheMap.getFieldMap(className);
203 204 205 206 207 208 209
			return cacheKey.get(className);
		}
	}

	public static <T> String getFieldRealName(Class<T> clazz,String fieldname) {
		fieldname=fieldname.toLowerCase();
		Hashtable<String,String> keys=DEFieldCacheMap.getFieldKeys(clazz);
210
		if(keys.containsKey(fieldname)) {
211
			return keys.get(fieldname);
212 213
		}
		else if(keys.containsKey(fieldname.replace("_",""))) {
214
			return keys.get(fieldname.replace("_",""));
215 216
		}
		else {
217
			return "";
218
		}
219 220 221 222
	}

	public static <T> Field getField(Class<T> clazz,String fieldname) {
		String fieldRealName=DEFieldCacheMap.getFieldRealName(clazz,fieldname);
223
		if(!StringUtils.isEmpty(fieldRealName)) {
224
			return DEFieldCacheMap.getFieldMap(clazz).get(fieldRealName);
225 226
		}
		else {
227
			return null;
228
		}
229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252
	}

	public static  <T> String getFieldColumnName(Class<T> clazz,String fieldname) {
		Field field = DEFieldCacheMap.getField(clazz,fieldname);
		if(field!=null) {
			DEField deField=field.getAnnotation(DEField.class);
			if(deField!=null&& !StringUtils.isEmpty(deField.name()))
				return deField.name();
		}
		return fieldname;
	}

	public static  <T> Object fieldValueOf(Class<T> clazz,String fieldname,Object fieldValue) {
		if(fieldValue==null)
			return null;
		Object resultValue=fieldValue;
		Field field = DEFieldCacheMap.getField(clazz,fieldname);
		if(field!=null) {
			Class<?> type=field.getType();
			resultValue = DataObject.objectValueOf(type,fieldValue);
		}
		return resultValue;
	}
}