mirror of
https://gitee.com/dromara/hutool.git
synced 2025-05-04 04:37:59 +08:00
add methods
This commit is contained in:
parent
87167a07d0
commit
8fda7fe8bd
@ -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)
|
||||
|
@ -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}实现
|
||||
*
|
||||
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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,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
|
@ -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);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user