add methods

This commit is contained in:
Looly 2020-03-17 15:39:25 +08:00
parent 87167a07d0
commit 8fda7fe8bd
8 changed files with 82 additions and 19 deletions

View File

@ -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

View File

@ -58,6 +58,23 @@ public class CallerUtil {
return INSTANCE.isCalledBy(clazz);
}
/**
* 获取调用此方法的方法名
*
* @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}实现
*

View File

@ -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;

View File

@ -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);
@ -33,6 +34,30 @@ public class Tree<T> extends LinkedHashMap<String, Object> implements Comparable
treeNodeConfig, TreeNodeConfig.DEFAULT_CONFIG);
}
/**
* 获取父节点
*
* @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
*
@ -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) {

View File

@ -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);
}
}

View File

@ -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

View File

@ -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

View File

@ -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);
}
}