package microservice.fpzj.utils;
import microservice.fpzj.po.dict.FpzjXzdwArray;
import org.aspectj.weaver.ast.Test;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
/**
* 作者 杨柳
* 创建时间 2017-07-05 16:54
*/
public class TreeUtils {
//例子
public static void main(String[] args){
TestTree testTree = new TestTree();
testTree.setId("1001");
testTree.setName("潍坊市");
testTree.setPid("1000");
TestTree testTree1 = new TestTree();
testTree1.setId("1002");
testTree1.setName("青岛市");
testTree1.setPid("1000");
TestTree testTree2 = new TestTree();
testTree2.setId("1001001");
testTree2.setName("高新区");
testTree2.setPid("1001");
TestTree testTree3 = new TestTree();
testTree3.setId("1002001");
testTree3.setName("四方区");
testTree3.setPid("1002");
TestTree testTree4 = new TestTree();
testTree4.setId("1000");
testTree4.setName("山东省");
testTree4.setPid("0");
TestTree testTree5 = new TestTree();
testTree5.setId("1001001001");
testTree5.setName("清池街办");
testTree5.setPid("1001001");
List testTreeList = new ArrayList<>();
testTreeList.add(testTree);
testTreeList.add(testTree1);
testTreeList.add(testTree2);
testTreeList.add(testTree3);
testTreeList.add(testTree4);
testTreeList.add(testTree5);
TreeUtils.createTree(testTreeList,testTree4,"id","pid","testTrees");
System.out.println(testTree4); //通过上边的createTree方法,根节点,即testTree4就是最全的最后的树结构。
}
/**
* @param list 树数据
* @param root 根节点
* @param keyFieldName 关联属性
* @param parentKeyFieldName 关联父属性
* @param subFieldName 子节点数据
* @param 根节点
*/
public static void createTree(List list, T root, String keyFieldName, String parentKeyFieldName, String subFieldName) {
Field keyField = ReflectUtils.getField(keyFieldName, root);
Field parentKeyField = ReflectUtils.getField(parentKeyFieldName, root);
Field subField = ReflectUtils.getField(subFieldName, root);
find(list, root, keyField, parentKeyField, subField);
}
/**
* 根据父节点的关联值 查找
*/
public static List getKeys(List list, T root, String keyFieldName, String parentKeyFieldName) {
Field keyField = ReflectUtils.getField(keyFieldName, root);
Field parentKeyField = ReflectUtils.getField(parentKeyFieldName, root);
List keys = new ArrayList<>();
E value = ReflectUtils.getValueByGetMethod(keyField, root);
keys.add(value);
findKeys(list, keys, root, keyField, parentKeyField);
return keys;
}
private static void find(List list, T parent, Field keyField, Field parentKeyField, Field subField) {
List subs = getSubs(list, parent, keyField, parentKeyField);
if (subs != null) {
ReflectUtils.setValueByField(subField, parent, subs);
for (T sub : subs) {
//递归找子节点
find(list, sub, keyField, parentKeyField, subField);
}
}
}
private static List findKeys(List list, List keys, T parent, Field keyField, Field parentKeyField) {
List subs = getSubs(list, parent, keyField, parentKeyField);
List subKeys = getSubKeys(list, parent, keyField, parentKeyField);
if (subs != null) {
keys.addAll(subKeys);
for (T sub : subs) {
//递归找子节点
findKeys(list, keys, sub, keyField, parentKeyField);
}
}
return keys;
}
private static List getSubs(List list, T parent, Field keyField, Field parentKeyField) {
List subs = null;
for (T t : list) {
Object keyFieldValue = ReflectUtils.getValueByField(keyField, parent);
Object parentFieldValue = ReflectUtils.getValueByField(parentKeyField, t);
if (keyFieldValue.equals(parentFieldValue)) {
if (subs == null) {
subs = new ArrayList<>();
}
subs.add(t);
}
}
return subs;
}
private static List getSubKeys(List list, T parent, Field keyField, Field parentKeyField) {
List subs = null;
for (T t : list) {
Object keyFieldValue = ReflectUtils.getValueByField(keyField, parent); //父节点key
Object parentFieldValue = ReflectUtils.getValueByField(parentKeyField, t); //根结点关联的key
if (keyFieldValue.equals(parentFieldValue)) { //关联字段相等
if (subs == null) {
subs = new ArrayList<>();
}
//取子节点key
Object key = ReflectUtils.getValueByField(keyField, t);
subs.add((E) key);
}
}
return subs;
}
}
class TestTree{
private String id;
private String name;
private String pid;
private List testTrees;
public List getTestTrees() {
return testTrees;
}
public void setTestTrees(List testTrees) {
this.testTrees = testTrees;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPid() {
return pid;
}
public void setPid(String pid) {
this.pid = pid;
}
}
package microservice.fpzj.utils;
import org.apache.commons.lang3.*;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Created by 杨柳 on 2016/8/5 0005.
* email:yangliu@buestc.com
* tel:18523437817
*/
public class ReflectUtils {
/**
* 根据属性名获取属性
*/
public static Field getField(String fieldName, Class> clazz) {
Class> old = clazz;
Field field = null;
for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
try {
field = clazz.getDeclaredField(fieldName);
if (field != null) {
break;
}
} catch (Exception e) {
}
}
if (field == null) {
throw new NullPointerException(old + "没有" + fieldName + "属性");
}
return field;
}
/**
* 获取目标类的属性
*/
public static Field getField(String fieldName, String className) {
try {
return getField(fieldName, Class.forName(className));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 获取目标对象的属性
*/
public static Field getField(String fieldName, Object object) {
return getField(fieldName, object.getClass());
}
/**
* 获取当前类的属性 包括父类
*/
public static List getFields(Class> clazz, Class> stopClass) {
try {
List fieldList = new ArrayList<>();
while (clazz != null && clazz != stopClass) {//当父类为null的时候说明到达了最上层的父类(Object类).
fieldList.addAll(Arrays.asList(clazz.getDeclaredFields()));
clazz = clazz.getSuperclass(); //得到父类,然后赋给自己
}
return fieldList;
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
/**
* 获取当前类的属性 包括父类
*/
@Deprecated
public static List getFields(Class> clazz) {
return getFields(clazz, Object.class);
}
private static List> getSuperClasses(Class> clazz, Class> stopClass) {
List> classes = new ArrayList<>();
while (clazz != null && clazz != stopClass) {//当父类为null的时候说明到达了最上层的父类(Object类).
classes.add(clazz);
clazz = clazz.getSuperclass(); //得到父类,然后赋给自己
}
return classes;
}
/**
* 通过属性赋值
*/
public static void setValueByField(String fieldName, Object object, Object value) {
Field field = getField(fieldName, object.getClass());
setValueByField(field, object, value);
}
/**
* 通过属性赋值
*/
public static void setValueByField(Field field, Object object, Object value) {
try {
if (!field.isAccessible()) {
field.setAccessible(true);
field.set(object, value);
field.setAccessible(false);
} else {
field.set(object, value);
}
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
/**
* 获取属性的值
*/
public static T getValueByField(String fieldName, Object object) {
Field field = getField(fieldName, object.getClass());
return getValueByField(field, object);
}
/**
* 获取属性的值
*/
public static T getValueByField(Field field, Object object) {
try {
Object value;
if (!field.isAccessible()) {
field.setAccessible(true);
value = field.get(object);
field.setAccessible(false);
} else {
value = field.get(object);
}
return (T) value;
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
/**
* 通过set方法赋值
*/
public static void setValueBySetMethod(String fieldName, Object object, Object value) {
if (object == null) {
throw new RuntimeException("实例对象不能为空");
}
if (value == null) {
return;
}
try {
String setMethodName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
Method setMethod = getMethod(setMethodName, object.getClass(), value.getClass());
setMethod.invoke(object, value);
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
/**
* 通过set方法赋值
*/
public static void setValueBySetMethod(Field field, Object object, Object value) {
if (object == null) {
throw new RuntimeException("实例对象不能为空");
}
if (value == null) {
return;
}
setValueBySetMethod(field.getName(), object, value);
}
/**
* 通过get方法取值
*/
public static T getValueByGetMethod(String fieldName, Object object) {
try {
if (StringUtils.isNotBlank(fieldName)) {
String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
Method getMethod = getMethod(getMethodName, object.getClass());
return (T) getMethod.invoke(object);
} else {
return null;
}
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
/**
* 通过get方法取值
*/
public static T getValueByGetMethod(Field field, Object object) {
return getValueByGetMethod(field.getName(), object);
}
/**
* 获取某个类的某个方法(当前类和父类)
*/
public static Method getMethod(String methodName, Class> clazz) {
Method method = null;
for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
try {
method = clazz.getDeclaredMethod(methodName);
break;
} catch (Exception e) {
}
}
if (method == null) {
throw new NullPointerException("没有" + methodName + "方法");
}
return method;
}
/**
* 获取get方法
*
* @param fieldName 属性名
* @return
*/
public static String getMethodName(String fieldName) {
String methodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
return methodName;
}
/**
* 获取某个类的某个方法(当前类和父类) 带一个参数
*/
public static Method getMethod(String methodName, Class> clazz, Class> paramType) {
Method method = null;
for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
try {
method = clazz.getDeclaredMethod(methodName, paramType);
if (method != null) {
return method;
}
} catch (Exception e) {
}
}
if (method == null) {
throw new NullPointerException(clazz + "没有" + methodName + "方法");
}
return method;
}
/**
* 获取某个类的某个方法(当前类和父类)
*/
public static Method getMethod(String methodName, Object obj) {
return getMethod(methodName, obj.getClass());
}
/**
* 获取某个类的某个方法(当前类和父类) 一个参数
*/
public static Method getMethod(String methodName, Object obj, Class> paramType) {
return getMethod(methodName, obj.getClass(), paramType);
}
/**
* 获取某个类的某个方法(当前类和父类)
*/
public static Method getMethod(String methodName, String clazz) {
try {
return getMethod(methodName, Class.forName(clazz));
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
/**
* 获取某个类的某个方法(当前类和父类) 一个参数
*/
public static Method getMethod(String methodName, String clazz, Class> paramType) {
try {
return getMethod(methodName, Class.forName(clazz), paramType);
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
/**
* 获取方法上的注解
*/
public static Annotation getMethodAnnotation(Method method, Class targetAnnotationClass) {
Annotation methodAnnotation = method.getAnnotation(targetAnnotationClass);
return methodAnnotation;
}
/**
* 获取属性上的注解
*/
public static Annotation getFieldAnnotation(Field field, Class targetAnnotationClass) {
Annotation methodAnnotation = field.getAnnotation(targetAnnotationClass);
return methodAnnotation;
}
/**
* 获取类上的注解
*
* @param targetAnnotationClass 目标注解
* @param targetObjcetClass 目标类
* @return 目标注解实例
*/
public static Annotation getClassAnnotation(Class targetAnnotationClass, Class> targetObjcetClass) {
Annotation methodAnnotation = targetObjcetClass.getAnnotation(targetAnnotationClass);
return methodAnnotation;
}
/**
* 获取类上的注解
*
* @return 目标注解实例
*/
public static Annotation getClassAnnotation(Class targetAnnotationClass, Object obj) {
return getClassAnnotation(targetAnnotationClass, obj.getClass());
}
/**
* 获取类上的注解
*
* @return 目标注解实例
*/
public static Annotation getClassAnnotation(Class targetAnnotationClass, String clazz) {
try {
return getClassAnnotation(targetAnnotationClass, Class.forName(clazz));
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
/**
* 获取注解某个属性的值
*
* @param methodName 属性名
* @param annotation 目标注解
* @param 返回类型
* @throws Exception
*/
public static T getAnnotationValue(String methodName, Annotation annotation) {
try {
Method method = annotation.annotationType().getMethod(methodName);
Object object = method.invoke(annotation);
return (T) object;
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
/**
* 获取某个类的某个方法上的某个注解的属性
*
* @param methodName 注解属性的名字
* @param targetAnnotationClass 目标注解
* @param targetObjecMethodName 目标类的方法
* @param targetObjectClass 目标类
* @param 返回值类型
*/
public static T getMethodAnnotationValue(String methodName, Class targetAnnotationClass, String targetObjecMethodName, Class targetObjectClass) {
Method method = getMethod(targetObjecMethodName, targetObjectClass);
Annotation annotation = getMethodAnnotation(method, targetAnnotationClass);
return getAnnotationValue(methodName, annotation);
}
/**
* @param methodName 注解属性名
* @param targetAnnotationClass 目标注解
* @param targetObjecFieldName 目标属性名字
* @param targetObjectClass 目标类
* @param 返回值类型
*/
public static T getFieldAnnotationValue(String methodName, Class targetAnnotationClass, String targetObjecFieldName, Class targetObjectClass) {
Field field = getField(targetObjecFieldName, targetObjectClass);
Annotation annotation = getFieldAnnotation(field, targetAnnotationClass);
return getAnnotationValue(methodName, annotation);
}
/**
* 判断 clazz是否是target的子类型或者相等
*/
public static boolean isSubClassOrEquesClass(Class> clazz, Class> target) {
if (clazz == target) {
return true;
}
while (clazz != Object.class) {
if (clazz == target) {
return true;
}
clazz = clazz.getSuperclass();
}
return false;
}
}