mirror of
https://gitee.com/dromara/hutool.git
synced 2025-05-07 14:18:05 +08:00
add methods
This commit is contained in:
parent
87167a07d0
commit
8fda7fe8bd
@ -12,6 +12,8 @@
|
|||||||
* 【core 】 BooleanUtil中重载歧义修正,修改了包装参数的方法名(issue#I1BSK8@Gitee)
|
* 【core 】 BooleanUtil中重载歧义修正,修改了包装参数的方法名(issue#I1BSK8@Gitee)
|
||||||
* 【core 】 XmlUtil增加xmlToBean和beanToXml方法
|
* 【core 】 XmlUtil增加xmlToBean和beanToXml方法
|
||||||
* 【db 】 设置全局忽略大小写DbUtil.setCaseInsensitiveGlobal(true)(issue#784@Github)
|
* 【db 】 设置全局忽略大小写DbUtil.setCaseInsensitiveGlobal(true)(issue#784@Github)
|
||||||
|
* 【core 】 增加CallerUtil.getCallerMethodName方法
|
||||||
|
* 【core 】 Tree增加getParent方法,可以获取父节点
|
||||||
|
|
||||||
### Bug修复
|
### Bug修复
|
||||||
* 【core 】 修复TypeUtil无法获取泛型接口的泛型参数问题(issue#I1BRFI@Gitee)
|
* 【core 】 修复TypeUtil无法获取泛型接口的泛型参数问题(issue#I1BRFI@Gitee)
|
||||||
|
@ -58,6 +58,23 @@ public class CallerUtil {
|
|||||||
return INSTANCE.isCalledBy(clazz);
|
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}实现
|
* 尝试创建{@link Caller}实现
|
||||||
*
|
*
|
||||||
|
@ -16,7 +16,7 @@ public class StackTraceCaller implements Caller, Serializable {
|
|||||||
@Override
|
@Override
|
||||||
public Class<?> getCaller() {
|
public Class<?> getCaller() {
|
||||||
final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
|
final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
|
||||||
if (null == stackTrace || (OFFSET + 1) >= stackTrace.length) {
|
if (OFFSET + 1 >= stackTrace.length) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
final String className = stackTrace[OFFSET + 1].getClassName();
|
final String className = stackTrace[OFFSET + 1].getClassName();
|
||||||
@ -30,7 +30,7 @@ public class StackTraceCaller implements Caller, Serializable {
|
|||||||
@Override
|
@Override
|
||||||
public Class<?> getCallerCaller() {
|
public Class<?> getCallerCaller() {
|
||||||
final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
|
final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
|
||||||
if (null == stackTrace || (OFFSET + 2) >= stackTrace.length) {
|
if (OFFSET + 2 >= stackTrace.length) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
final String className = stackTrace[OFFSET + 2].getClassName();
|
final String className = stackTrace[OFFSET + 2].getClassName();
|
||||||
@ -44,7 +44,7 @@ public class StackTraceCaller implements Caller, Serializable {
|
|||||||
@Override
|
@Override
|
||||||
public Class<?> getCaller(int depth) {
|
public Class<?> getCaller(int depth) {
|
||||||
final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
|
final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
|
||||||
if (null == stackTrace || (OFFSET + depth) >= stackTrace.length) {
|
if (OFFSET + depth >= stackTrace.length) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
final String className = stackTrace[OFFSET + depth].getClassName();
|
final String className = stackTrace[OFFSET + depth].getClassName();
|
||||||
@ -58,11 +58,9 @@ public class StackTraceCaller implements Caller, Serializable {
|
|||||||
@Override
|
@Override
|
||||||
public boolean isCalledBy(Class<?> clazz) {
|
public boolean isCalledBy(Class<?> clazz) {
|
||||||
final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
|
final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
|
||||||
if(null != stackTrace) {
|
for (final StackTraceElement element : stackTrace) {
|
||||||
for (final StackTraceElement element : stackTrace) {
|
if (element.getClassName().equals(clazz.getName())) {
|
||||||
if (element.getClassName().equals(clazz.getName())) {
|
return true;
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -17,6 +17,7 @@ public class Tree<T> extends LinkedHashMap<String, Object> implements Comparable
|
|||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
private TreeNodeConfig treeNodeConfig;
|
private TreeNodeConfig treeNodeConfig;
|
||||||
|
private Tree<T> parent;
|
||||||
|
|
||||||
public Tree() {
|
public Tree() {
|
||||||
this(null);
|
this(null);
|
||||||
@ -33,6 +34,30 @@ public class Tree<T> extends LinkedHashMap<String, Object> implements Comparable
|
|||||||
treeNodeConfig, TreeNodeConfig.DEFAULT_CONFIG);
|
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
|
* 获取节点ID
|
||||||
*
|
*
|
||||||
@ -46,7 +71,7 @@ public class Tree<T> extends LinkedHashMap<String, Object> implements Comparable
|
|||||||
/**
|
/**
|
||||||
* 设置节点ID
|
* 设置节点ID
|
||||||
*
|
*
|
||||||
* @param id 节点ID
|
* @param id 节点ID
|
||||||
* @return this
|
* @return this
|
||||||
*/
|
*/
|
||||||
public Tree<T> setId(T id) {
|
public Tree<T> setId(T id) {
|
||||||
|
@ -62,18 +62,19 @@ public class TreeUtil {
|
|||||||
* @return List
|
* @return List
|
||||||
*/
|
*/
|
||||||
public static <T, E> List<Tree<E>> build(List<T> list, E parentId, TreeNodeConfig treeNodeConfig, NodeParser<T, E> nodeParser) {
|
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) {
|
for (T obj : list) {
|
||||||
Tree<E> treeNode = new Tree<>(treeNodeConfig);
|
treeNode = new Tree<>(treeNodeConfig);
|
||||||
nodeParser.parse(obj, treeNode);
|
nodeParser.parse(obj, treeNode);
|
||||||
treeNodes.add(treeNode);
|
treeNodes.add(treeNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Tree<E>> finalTreeNodes = CollUtil.newArrayList();
|
List<Tree<E>> finalTreeNodes = CollUtil.newArrayList();
|
||||||
for (Tree<E> treeNode : treeNodes) {
|
for (Tree<E> node : treeNodes) {
|
||||||
if (parentId.equals(treeNode.getParentId())) {
|
if (parentId.equals(node.getParentId())) {
|
||||||
finalTreeNodes.add(treeNode);
|
finalTreeNodes.add(node);
|
||||||
innerBuild(treeNodes, treeNode, 0, treeNodeConfig.getDeep());
|
innerBuild(treeNodes, node, 0, treeNodeConfig.getDeep());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 内存每层已经排过了 这是最外层排序
|
// 内存每层已经排过了 这是最外层排序
|
||||||
@ -109,7 +110,8 @@ public class TreeUtil {
|
|||||||
parentNode.setChildren(children);
|
parentNode.setChildren(children);
|
||||||
}
|
}
|
||||||
children.add(childNode);
|
children.add(childNode);
|
||||||
childNode.setParentId(parentNode.getId());
|
// childNode.setParentId(parentNode.getId());
|
||||||
|
childNode.setParent(parentNode);
|
||||||
innerBuild(treeNodes, childNode, deep + 1, maxDeep);
|
innerBuild(treeNodes, childNode, deep + 1, maxDeep);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -37,6 +37,11 @@ public class TreeTest {
|
|||||||
for (Tree<String> tree : treeNodes) {
|
for (Tree<String> tree : treeNodes) {
|
||||||
Assert.assertNotNull(tree);
|
Assert.assertNotNull(tree);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 测试通过子节点查找父节点
|
||||||
|
final Tree<String> rootNode0 = treeNodes.get(0);
|
||||||
|
final Tree<String> parent = rootNode0.getChildren().get(0).getParent();
|
||||||
|
Assert.assertEquals(rootNode0, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
package cn.hutool.core.lang;
|
package cn.hutool.core.lang.caller;
|
||||||
|
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import cn.hutool.core.lang.caller.CallerUtil;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@link CallerUtil} 单元测试
|
* {@link CallerUtil} 单元测试
|
||||||
* @author Looly
|
* @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