package com.opslab.util.bean;
import com.opslab.util.valid;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Hashtable;
import java.util.Map;
/**
* 提供一些BeanUti需要的方法
*/
public class Factory {
/**
* 存放BeanUtil解析过的JavaBean数据
* 只获取简单的属性字段
*/
public static Map<String,Map<String,BeanStruct>> BEAN_SIMPLE_PROPERTIES = new Hashtable<>();
/**
* 存放BeanUtil解析过的JavaBean数据
* 只获取简单的属性字段(忽略字段名字的大小写)
*/
public static Map<String,Map<String,BeanStruct>> BEAN_SIMPLE_PROPERTIESIGNORE = new Hashtable<>();
static {
//可以实现实现明确的JavaBean的配置
}
public static boolean isDeclaredField(String className, String pro) throws ClassNotFoundException {
Class classz = Class.forName(className);
Field[] fields = classz.getFields();
if (valid.valid(fields)) {
for (Field f : fields) {
if (f.getName().equals(pro)) {
return false;
}
}
}
return true;
}
/**
* 将JavaBean进行解析并存在在static变量中
*
* @param obj
*/
public static void add(Object obj) throws IntrospectionException, ClassNotFoundException {
add(obj.getClass());
}
public static void add(Class clazz) throws IntrospectionException, ClassNotFoundException {
String className = clazz.getName();
if (!valid.valid(BEAN_SIMPLE_PROPERTIES.get(className))) {
BeanInfo beanInfo = Introspector.getBeanInfo(clazz);
PropertyDescriptor[] proDescrtptors = beanInfo.getPropertyDescriptors();
if (proDescrtptors != null && proDescrtptors.length > 0) {
Map<String,BeanStruct> simpleProperties = new Hashtable<>();
Map<String,BeanStruct> simplePropertiesIgnore = new Hashtable<>();
for (PropertyDescriptor propDesc : proDescrtptors) {
String fieldName = propDesc.getName();
if (!"class".equals(fieldName)) {
Object type = propDesc.getPropertyType();
Method readMethod = propDesc.getReadMethod();
Method writeMethod = propDesc.getWriteMethod();
boolean isDeclared = isDeclaredField(className, fieldName);
simpleProperties.put(fieldName, new BeanStruct(fieldName, type, readMethod, writeMethod, isDeclared));
simplePropertiesIgnore.put(fieldName.toLowerCase(), new BeanStruct(fieldName, type, readMethod, writeMethod, isDeclared));
}
}
BEAN_SIMPLE_PROPERTIES.put(className, simpleProperties);
BEAN_SIMPLE_PROPERTIESIGNORE.put(className, simplePropertiesIgnore);
}
}
}
}