parent
1dc37eb4b0
commit
dc45b37985
3 changed files with 417 additions and 0 deletions
@ -0,0 +1,220 @@ |
||||
package org.panda.beans.util; |
||||
|
||||
|
||||
import org.slf4j.Logger; |
||||
import org.slf4j.LoggerFactory; |
||||
|
||||
import java.beans.IntrospectionException; |
||||
import java.beans.PropertyDescriptor; |
||||
import java.lang.reflect.Field; |
||||
import java.lang.reflect.InvocationTargetException; |
||||
import java.lang.reflect.Method; |
||||
import java.util.*; |
||||
|
||||
|
||||
/** |
||||
* @author qi |
||||
* Created by qi_liang on 2018/1/29. |
||||
*/ |
||||
public class BeanUtil { |
||||
|
||||
private final static Logger LOGGER = LoggerFactory.getLogger(BeanUtil.class); |
||||
/** |
||||
* 获取类属性,包括父类属性 |
||||
* @param clazz |
||||
*/ |
||||
public static List<Field> getAllField(Class clazz){ |
||||
Field[] fields = getField(clazz); |
||||
List<Field> fieldList = new ArrayList<>(); |
||||
Field[] superFields = getSuperField(clazz); |
||||
if (superFields!=null&&superFields.length>0){ |
||||
for (Field field:superFields) { |
||||
fieldList.add(field); |
||||
} |
||||
} |
||||
if (fields!=null&&fields.length>0){ |
||||
for (Field field:fields){ |
||||
fieldList.add(field); |
||||
} |
||||
} |
||||
return fieldList; |
||||
} |
||||
|
||||
/** |
||||
* 获取类属性 |
||||
* @param clazz |
||||
* @return |
||||
*/ |
||||
public static Field[] getField(Class clazz){ |
||||
|
||||
return clazz.getDeclaredFields(); |
||||
} |
||||
|
||||
/** |
||||
* 获取父类的属性 |
||||
* @param clazz |
||||
* @return |
||||
*/ |
||||
public static Field[] getSuperField(Class clazz){ |
||||
|
||||
return clazz.getSuperclass().getDeclaredFields(); |
||||
} |
||||
|
||||
/** |
||||
* 复制属性,不为空的复制,为空忽略 |
||||
*/ |
||||
public static void copyNotNull(Object targer,Object source){ |
||||
|
||||
Class sourceClass = source.getClass(); |
||||
List<Field> fieldList = getAllField(sourceClass); |
||||
Map<String,Field> fieldMap = new HashMap<>(fieldList.size()); |
||||
for (Field field: fieldList){ |
||||
field.setAccessible(true); |
||||
fieldMap.put(field.getName(),field); |
||||
} |
||||
Class targerClass = targer.getClass(); |
||||
List<Field> targerFieldList = getAllField(targerClass); |
||||
for (Field field:targerFieldList){ |
||||
field.setAccessible(true); |
||||
Field targerField = fieldMap.get(field.getName()); |
||||
//判断类型是否相等
|
||||
if (targerField!=null&&targerField.getGenericType().toString().equals(field.getGenericType().toString())){ |
||||
try { |
||||
PropertyDescriptor pd = new PropertyDescriptor(targerField.getName(), targerClass); |
||||
//获得写方法
|
||||
Method wM = pd.getWriteMethod(); |
||||
Object value = targerField.get(source); |
||||
if (value!=null) { |
||||
wM.invoke(targer, value); |
||||
} |
||||
} catch (IllegalAccessException e) { |
||||
e.printStackTrace(); |
||||
} catch (IntrospectionException e) { |
||||
e.printStackTrace(); |
||||
} catch (InvocationTargetException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
} |
||||
|
||||
} |
||||
|
||||
/** |
||||
* 通过反射获取属性的数据类型 |
||||
* key 属性名 |
||||
* value 类型 |
||||
* @param fields |
||||
* @return |
||||
*/ |
||||
public static Map<String,String> getFiledType(Field[] fields){ |
||||
Map<String,String> map=new HashMap(fields.length); |
||||
for (Field field:fields){ |
||||
map.put(field.getName(),field.getGenericType().toString()); |
||||
} |
||||
return map; |
||||
} |
||||
|
||||
/** |
||||
* 获取对象属性详情 |
||||
* @param fields |
||||
* @return |
||||
*/ |
||||
public static List<Map<String,String>> getFieldInfo(Field[] fields){ |
||||
List<Map<String,String>> list=new ArrayList<>(); |
||||
for (Field field:fields){ |
||||
Map<String,String> map = new HashMap(2); |
||||
map.put("fieldName",field.getName()); |
||||
map.put("fieldType",field.getGenericType().toString()); |
||||
list.add(map); |
||||
} |
||||
return list; |
||||
} |
||||
|
||||
/** |
||||
* 返回属性名列表 |
||||
* @param fields |
||||
* @return |
||||
*/ |
||||
public static List<String> getFiledName(Field[] fields){ |
||||
List<String> filedNameList=new ArrayList<>(); |
||||
for (Field field:fields){ |
||||
filedNameList.add(field.getName()); |
||||
} |
||||
return filedNameList; |
||||
} |
||||
|
||||
/** |
||||
* 返回属性类型列表 |
||||
* @param fields |
||||
* @return |
||||
*/ |
||||
public static List<String> getFileTypeList(Field[] fields){ |
||||
List<String> fileTypeList=new ArrayList<>(); |
||||
for (Field field:fields){ |
||||
fileTypeList.add(field.getGenericType().toString()); |
||||
} |
||||
return fileTypeList; |
||||
} |
||||
|
||||
|
||||
|
||||
public static String getEntityName(Class entityClazz){ |
||||
String entityPath=entityClazz.getName(); |
||||
String [] entityNameArray=entityPath.split("\\."); |
||||
String entityName=entityNameArray[entityNameArray.length-1]; |
||||
return entityName; |
||||
} |
||||
|
||||
/** |
||||
* 判断对象是否该与类型一致 |
||||
* @param obj |
||||
* @param clazzType |
||||
* @return |
||||
*/ |
||||
public static Boolean isType(Object obj,Class clazzType){ |
||||
if (obj!=null) { |
||||
Class clazz = obj.getClass(); |
||||
return clazz.getTypeName().equals(clazzType.getTypeName()) ? true : false; |
||||
} |
||||
else{ |
||||
return false; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 获取属性的value |
||||
* @return |
||||
*/ |
||||
public static Map<String,Object> getFieldValue(Object obj){ |
||||
Class clazz = obj.getClass(); |
||||
List<Field> fieldList = BeanUtil.getAllField(clazz); |
||||
Map<String,Object> fieldObjectMap = new HashMap<>(fieldList.size()); |
||||
fieldList.forEach((field)->{ |
||||
try { |
||||
//开启强制破解
|
||||
field.setAccessible(true); |
||||
Object value = field.get(obj); |
||||
if (value!=null) { |
||||
fieldObjectMap.put(field.getName(), obj); |
||||
} |
||||
} catch (IllegalAccessException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
}); |
||||
return fieldObjectMap; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 判断对象是否为空 ,为空返回true |
||||
* @param object |
||||
* @return |
||||
*/ |
||||
public boolean isNull(Object object){ |
||||
|
||||
return object==null; |
||||
} |
||||
|
||||
|
||||
|
||||
} |
@ -0,0 +1,143 @@ |
||||
package org.panda.beans.util; |
||||
|
||||
|
||||
import org.panda.code.uitl.StringUtil; |
||||
import org.slf4j.Logger; |
||||
import org.slf4j.LoggerFactory; |
||||
|
||||
import java.io.File; |
||||
import java.io.IOException; |
||||
import java.net.JarURLConnection; |
||||
import java.net.URL; |
||||
import java.util.*; |
||||
import java.util.jar.JarEntry; |
||||
import java.util.jar.JarFile; |
||||
|
||||
/** |
||||
* 类加载器 |
||||
*/ |
||||
public class ClassUtil { |
||||
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(ClassUtil.class); |
||||
|
||||
/** |
||||
* 类加载器 |
||||
* @return |
||||
*/ |
||||
public static ClassLoader getClassLoader(){ |
||||
|
||||
return Thread.currentThread().getContextClassLoader(); |
||||
} |
||||
|
||||
/** |
||||
* 加载类 |
||||
* @param className |
||||
* @param isInitialized |
||||
* @return |
||||
*/ |
||||
public static Class<?> loadClass(String className,boolean isInitialized){ |
||||
Class<?> clazz = null; |
||||
try { |
||||
clazz = Class.forName(className,isInitialized,getClassLoader()); |
||||
} catch (ClassNotFoundException e) { |
||||
LOGGER.error("load class failure",e); |
||||
throw new RuntimeException(e); |
||||
} |
||||
return clazz; |
||||
} |
||||
|
||||
/** |
||||
* 返回类实现接口集合 |
||||
*/ |
||||
public static List<Class> getInterClass(Class clazz){ |
||||
Class[] classes = clazz.getInterfaces(); |
||||
List<Class> classList = Arrays.asList(classes); |
||||
return classList; |
||||
} |
||||
|
||||
/** |
||||
* 获取指定包名下的所有类 |
||||
* @param packageName |
||||
* @return |
||||
*/ |
||||
public static Set<Class> getClassSet(String packageName){ |
||||
//class 集合
|
||||
Set<Class> classSet = new HashSet<>(); |
||||
|
||||
try { |
||||
Enumeration<URL> urls = getClassLoader().getResources(packageName.replace(".","/")); |
||||
while (urls.hasMoreElements()){ |
||||
URL url = urls.nextElement(); |
||||
if (url!=null){ |
||||
String protocol = url.getProtocol(); |
||||
if ("file".equals(protocol)){ |
||||
//替换空格
|
||||
String packagePath = url.getPath().replace("%20",""); |
||||
addClass(classSet,packagePath,packageName); |
||||
}else if ("".equals(protocol)){ |
||||
JarURLConnection jarURLConnection =(JarURLConnection) url.openConnection(); |
||||
if (jarURLConnection!=null){ |
||||
JarFile jarFile = jarURLConnection.getJarFile(); |
||||
if (jarFile!=null){ |
||||
Enumeration<JarEntry> jarEntries = jarFile.entries(); |
||||
while (jarEntries.hasMoreElements()){ |
||||
JarEntry jarEntry = jarEntries.nextElement(); |
||||
String jarEntryName = jarEntry.getName(); |
||||
if (jarEntryName.endsWith(".class")){ |
||||
String className = jarEntryName.substring(0,jarEntryName.lastIndexOf(".")) |
||||
.replace("/","."); |
||||
doAddClass(classSet,className); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} catch (IOException e) { |
||||
LOGGER.error("获取实体类流异常",e); |
||||
throw new RuntimeException(e); |
||||
} |
||||
return classSet; |
||||
} |
||||
|
||||
/** |
||||
* 该处可以使用jdk8新特性优化 |
||||
* @param classSet |
||||
* @param packagePath |
||||
* @param packageName |
||||
*/ |
||||
private static void addClass(Set<Class> classSet,String packagePath,String packageName){ |
||||
File[] files = new File(packagePath).listFiles((File file)->{ |
||||
return (file.isFile()&&file.getName().endsWith(".class"))||file.isDirectory(); |
||||
}); |
||||
for (File file:files){ |
||||
String fileName = file.getName(); |
||||
if (file.isFile()){ |
||||
String className = fileName.substring(0,fileName.lastIndexOf(".")); |
||||
if (StringUtil.isNotNull(packageName)){ |
||||
className = packageName+"."+className; |
||||
doAddClass(classSet,className); |
||||
} |
||||
}else { |
||||
String subPackagePath = fileName; |
||||
if (StringUtil.isNotNull(subPackagePath)){ |
||||
subPackagePath = packagePath+"/"+subPackagePath; |
||||
} |
||||
String subPackageName = fileName; |
||||
if (StringUtil.isNotNull(subPackageName)){ |
||||
subPackageName = packageName+"."+subPackageName; |
||||
} |
||||
addClass(classSet,subPackagePath,subPackageName); |
||||
} |
||||
} |
||||
|
||||
} |
||||
|
||||
public static void doAddClass(Set<Class> classSet,String className){ |
||||
Class<?> clazz = loadClass(className,false); |
||||
classSet.add(clazz); |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,54 @@ |
||||
package org.panda.web.helper; |
||||
|
||||
import org.panda.code.uitl.ReflectionUtil; |
||||
import java.util.HashMap; |
||||
import java.util.Map; |
||||
import java.util.Set; |
||||
|
||||
/** |
||||
* Bean助手类 |
||||
*/ |
||||
public class BeanHelper { |
||||
|
||||
private static Map<Class, Object> BEAN_MAP = new HashMap<>(); |
||||
|
||||
static { |
||||
Set<Class> beanClassSet = ClassHelper.getBeanClassSet(); |
||||
|
||||
beanClassSet.forEach(clazz -> { |
||||
Object obj = ReflectionUtil.newInstance(clazz); |
||||
BEAN_MAP.put(clazz, obj); |
||||
}); |
||||
} |
||||
|
||||
/** |
||||
* 获取 Bean 映射 |
||||
* |
||||
* @return |
||||
*/ |
||||
public static Map<Class, Object> getBeanMap() { |
||||
return BEAN_MAP; |
||||
} |
||||
|
||||
/** |
||||
* 获取 Bean 实例 |
||||
* |
||||
* @param clazz |
||||
* @param <T> |
||||
* @return |
||||
*/ |
||||
public static <T> T getBean(Class<T> clazz) { |
||||
|
||||
if (!BEAN_MAP.containsKey(clazz)) { |
||||
throw new RuntimeException("can not get bean by class" + clazz); |
||||
} |
||||
return (T) BEAN_MAP.get(clazz); |
||||
} |
||||
|
||||
/** |
||||
* 设置Bean实例 |
||||
*/ |
||||
public static void setBean(Class clazz, Object obj) { |
||||
BEAN_MAP.put(clazz, obj); |
||||
} |
||||
} |
Loading…
Reference in new issue