Looly 5 年 前
コミット
8fda7fe8bd

+ 2 - 0
CHANGELOG.md

@@ -12,6 +12,8 @@
 * 【core   】     BooleanUtil中重载歧义修正,修改了包装参数的方法名(issue#I1BSK8@Gitee)
 * 【core   】     XmlUtil增加xmlToBean和beanToXml方法
 * 【db     】     设置全局忽略大小写DbUtil.setCaseInsensitiveGlobal(true)(issue#784@Github)
+* 【core   】     增加CallerUtil.getCallerMethodName方法
+* 【core   】     Tree增加getParent方法,可以获取父节点
 
 ### Bug修复
 * 【core   】     修复TypeUtil无法获取泛型接口的泛型参数问题(issue#I1BRFI@Gitee)

+ 17 - 0
hutool-core/src/main/java/cn/hutool/core/lang/caller/CallerUtil.java

@@ -59,6 +59,23 @@ public class CallerUtil {
 	}
 
 	/**
+	 * 获取调用此方法的方法名
+	 *
+	 * @param isFullName 是否返回全名,全名包括方法所在类的全路径名
+	 * @return 调用此方法的方法名
+	 * @since 5.2.4
+	 */
+	public static String getCallerMethodName(boolean isFullName){
+		final StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[2];
+		final String methodName = stackTraceElement.getMethodName();
+		if(false == isFullName){
+			return methodName;
+		}
+
+		return stackTraceElement.getClassName() + "." + methodName;
+	}
+
+	/**
 	 * 尝试创建{@link Caller}实现
 	 * 
 	 * @return {@link Caller}实现

+ 6 - 8
hutool-core/src/main/java/cn/hutool/core/lang/caller/StackTraceCaller.java

@@ -16,7 +16,7 @@ public class StackTraceCaller implements Caller, Serializable {
 	@Override
 	public Class<?> getCaller() {
 		final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
-		if (null == stackTrace || (OFFSET + 1) >= stackTrace.length) {
+		if (OFFSET + 1 >= stackTrace.length) {
 			return null;
 		}
 		final String className = stackTrace[OFFSET + 1].getClassName();
@@ -30,7 +30,7 @@ public class StackTraceCaller implements Caller, Serializable {
 	@Override
 	public Class<?> getCallerCaller() {
 		final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
-		if (null == stackTrace || (OFFSET + 2) >= stackTrace.length) {
+		if (OFFSET + 2 >= stackTrace.length) {
 			return null;
 		}
 		final String className = stackTrace[OFFSET + 2].getClassName();
@@ -44,7 +44,7 @@ public class StackTraceCaller implements Caller, Serializable {
 	@Override
 	public Class<?> getCaller(int depth) {
 		final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
-		if (null == stackTrace || (OFFSET + depth) >= stackTrace.length) {
+		if (OFFSET + depth >= stackTrace.length) {
 			return null;
 		}
 		final String className = stackTrace[OFFSET + depth].getClassName();
@@ -58,11 +58,9 @@ public class StackTraceCaller implements Caller, Serializable {
 	@Override
 	public boolean isCalledBy(Class<?> clazz) {
 		final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
-		if(null != stackTrace) {
-			for (final StackTraceElement element : stackTrace) {
-				if (element.getClassName().equals(clazz.getName())) {
-					return true;
-				}
+		for (final StackTraceElement element : stackTrace) {
+			if (element.getClassName().equals(clazz.getName())) {
+				return true;
 			}
 		}
 		return false;

+ 26 - 1
hutool-core/src/main/java/cn/hutool/core/lang/tree/Tree.java

@@ -17,6 +17,7 @@ public class Tree<T> extends LinkedHashMap<String, Object> implements Comparable
 	private static final long serialVersionUID = 1L;
 
 	private TreeNodeConfig treeNodeConfig;
+	private Tree<T> parent;
 
 	public Tree() {
 		this(null);
@@ -34,6 +35,30 @@ public class Tree<T> extends LinkedHashMap<String, Object> implements Comparable
 	}
 
 	/**
+	 * 获取父节点
+	 *
+	 * @return 父节点
+	 * @since 5.2.4
+	 */
+	public Tree<T> getParent() {
+		return parent;
+	}
+
+	/**
+	 * 设置父节点
+	 *
+	 * @param parent 父节点
+	 * @since 5.2.4
+	 */
+	public Tree<T> setParent(Tree<T> parent) {
+		this.parent = parent;
+		if(null != parent){
+			this.setParentId(parent.getId());
+		}
+		return this;
+	}
+
+	/**
 	 * 获取节点ID
 	 *
 	 * @return 节点ID
@@ -46,7 +71,7 @@ public class Tree<T> extends LinkedHashMap<String, Object> implements Comparable
 	/**
 	 * 设置节点ID
 	 *
-	 * @param id  节点ID
+	 * @param id 节点ID
 	 * @return this
 	 */
 	public Tree<T> setId(T id) {

+ 9 - 7
hutool-core/src/main/java/cn/hutool/core/lang/tree/TreeUtil.java

@@ -62,18 +62,19 @@ public class TreeUtil {
 	 * @return List
 	 */
 	public static <T, E> List<Tree<E>> build(List<T> list, E parentId, TreeNodeConfig treeNodeConfig, NodeParser<T, E> nodeParser) {
-		List<Tree<E>> treeNodes = CollUtil.newArrayList();
+		final List<Tree<E>> treeNodes = CollUtil.newArrayList();
+		Tree<E> treeNode;
 		for (T obj : list) {
-			Tree<E> treeNode = new Tree<>(treeNodeConfig);
+			treeNode = new Tree<>(treeNodeConfig);
 			nodeParser.parse(obj, treeNode);
 			treeNodes.add(treeNode);
 		}
 
 		List<Tree<E>> finalTreeNodes = CollUtil.newArrayList();
-		for (Tree<E> treeNode : treeNodes) {
-			if (parentId.equals(treeNode.getParentId())) {
-				finalTreeNodes.add(treeNode);
-				innerBuild(treeNodes, treeNode, 0, treeNodeConfig.getDeep());
+		for (Tree<E> node : treeNodes) {
+			if (parentId.equals(node.getParentId())) {
+				finalTreeNodes.add(node);
+				innerBuild(treeNodes, node, 0, treeNodeConfig.getDeep());
 			}
 		}
 		// 内存每层已经排过了 这是最外层排序
@@ -109,7 +110,8 @@ public class TreeUtil {
 					parentNode.setChildren(children);
 				}
 				children.add(childNode);
-				childNode.setParentId(parentNode.getId());
+//				childNode.setParentId(parentNode.getId());
+				childNode.setParent(parentNode);
 				innerBuild(treeNodes, childNode, deep + 1, maxDeep);
 			}
 		}

+ 5 - 0
hutool-core/src/test/java/cn/hutool/core/lang/TreeTest.java

@@ -37,6 +37,11 @@ public class TreeTest {
 		for (Tree<String> tree : treeNodes) {
 			Assert.assertNotNull(tree);
 		}
+
+		// 测试通过子节点查找父节点
+		final Tree<String> rootNode0 = treeNodes.get(0);
+		final Tree<String> parent = rootNode0.getChildren().get(0).getParent();
+		Assert.assertEquals(rootNode0, parent);
 	}
 
 	@Test

+ 1 - 3
hutool-core/src/test/java/cn/hutool/core/lang/CallerTest.java

@@ -1,10 +1,8 @@
-package cn.hutool.core.lang;
+package cn.hutool.core.lang.caller;
 
 import org.junit.Assert;
 import org.junit.Test;
 
-import cn.hutool.core.lang.caller.CallerUtil;
-
 /**
  * {@link CallerUtil} 单元测试
  * @author Looly

+ 16 - 0
hutool-core/src/test/java/cn/hutool/core/lang/caller/CallerUtilTest.java

@@ -0,0 +1,16 @@
+package cn.hutool.core.lang.caller;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class CallerUtilTest {
+
+	@Test
+	public void getCallerMethodNameTest() {
+		final String callerMethodName = CallerUtil.getCallerMethodName(false);
+		Assert.assertEquals("getCallerMethodNameTest", callerMethodName);
+
+		final String fullCallerMethodName = CallerUtil.getCallerMethodName(true);
+		Assert.assertEquals("cn.hutool.core.lang.caller.CallerUtilTest.getCallerMethodNameTest", fullCallerMethodName);
+	}
+}