diff --git a/core/src/main/java/com/taobao/arthas/core/advisor/SpyImpl.java b/core/src/main/java/com/taobao/arthas/core/advisor/SpyImpl.java index 4e4a339af..8cf549623 100644 --- a/core/src/main/java/com/taobao/arthas/core/advisor/SpyImpl.java +++ b/core/src/main/java/com/taobao/arthas/core/advisor/SpyImpl.java @@ -2,12 +2,12 @@ package com.taobao.arthas.core.advisor; import java.arthas.SpyAPI.AbstractSpy; import java.util.List; -import java.util.regex.Pattern; import com.alibaba.arthas.deps.org.slf4j.Logger; import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.core.shell.system.ExecStatus; import com.taobao.arthas.core.shell.system.ProcessAware; +import com.taobao.arthas.core.util.StringUtils; /** *
@@ -27,7 +27,7 @@ public class SpyImpl extends AbstractSpy { public void atEnter(Class> clazz, String methodInfo, Object target, Object[] args) { ClassLoader classLoader = clazz.getClassLoader(); - String[] info = splitMethodInfo(methodInfo); + String[] info = StringUtils.splitMethodInfo(methodInfo); String methodName = info[0]; String methodDesc = info[1]; // TODO listener 只用查一次,放到 thread local里保存起来就可以了! @@ -52,7 +52,7 @@ public class SpyImpl extends AbstractSpy { public void atExit(Class> clazz, String methodInfo, Object target, Object[] args, Object returnObject) { ClassLoader classLoader = clazz.getClassLoader(); - String[] info = splitMethodInfo(methodInfo); + String[] info = StringUtils.splitMethodInfo(methodInfo); String methodName = info[0]; String methodDesc = info[1]; @@ -76,7 +76,7 @@ public class SpyImpl extends AbstractSpy { public void atExceptionExit(Class> clazz, String methodInfo, Object target, Object[] args, Throwable throwable) { ClassLoader classLoader = clazz.getClassLoader(); - String[] info = splitMethodInfo(methodInfo); + String[] info = StringUtils.splitMethodInfo(methodInfo); String methodName = info[0]; String methodDesc = info[1]; @@ -99,7 +99,7 @@ public class SpyImpl extends AbstractSpy { @Override public void atBeforeInvoke(Class> clazz, String invokeInfo, Object target) { ClassLoader classLoader = clazz.getClassLoader(); - String[] info = splitInvokeInfo(invokeInfo); + String[] info = StringUtils.splitInvokeInfo(invokeInfo); String owner = info[0]; String methodName = info[1]; String methodDesc = info[2]; @@ -125,7 +125,7 @@ public class SpyImpl extends AbstractSpy { @Override public void atAfterInvoke(Class> clazz, String invokeInfo, Object target) { ClassLoader classLoader = clazz.getClassLoader(); - String[] info = splitInvokeInfo(invokeInfo); + String[] info = StringUtils.splitInvokeInfo(invokeInfo); String owner = info[0]; String methodName = info[1]; String methodDesc = info[2]; @@ -151,7 +151,7 @@ public class SpyImpl extends AbstractSpy { @Override public void atInvokeException(Class> clazz, String invokeInfo, Object target, Throwable throwable) { ClassLoader classLoader = clazz.getClassLoader(); - String[] info = splitInvokeInfo(invokeInfo); + String[] info = StringUtils.splitInvokeInfo(invokeInfo); String owner = info[0]; String methodName = info[1]; String methodDesc = info[2]; @@ -174,15 +174,7 @@ public class SpyImpl extends AbstractSpy { } } - private String[] splitMethodInfo(String methodInfo) { - return methodInfo.split(Pattern.quote("|")); - } - - private String[] splitInvokeInfo(String invokeInfo) { - return invokeInfo.split(Pattern.quote("|")); - } - - private boolean skipAdviceListener(AdviceListener adviceListener) { + private static boolean skipAdviceListener(AdviceListener adviceListener) { if (adviceListener instanceof ProcessAware) { ProcessAware processAware = (ProcessAware) adviceListener; ExecStatus status = processAware.getProcess().status(); diff --git a/core/src/main/java/com/taobao/arthas/core/util/StringUtils.java b/core/src/main/java/com/taobao/arthas/core/util/StringUtils.java index f235f9439..b7700d71a 100644 --- a/core/src/main/java/com/taobao/arthas/core/util/StringUtils.java +++ b/core/src/main/java/com/taobao/arthas/core/util/StringUtils.java @@ -956,4 +956,16 @@ public abstract class StringUtils { } return text.substring(pos + after.length()); } + + public static String[] splitMethodInfo(String methodInfo) { + int index = methodInfo.indexOf('|'); + return new String[] { methodInfo.substring(0, index), methodInfo.substring(index + 1, methodInfo.length()) }; + } + + public static String[] splitInvokeInfo(String invokeInfo) { + int index1 = invokeInfo.indexOf('|'); + int index2 = invokeInfo.indexOf('|', index1 + 1); + return new String[] { invokeInfo.substring(0, index1), invokeInfo.substring(index1 + 1, index2), + invokeInfo.substring(index2 + 1, invokeInfo.length()) }; + } } diff --git a/core/src/test/java/com/taobao/arthas/core/advisor/SpyImplTest.java b/core/src/test/java/com/taobao/arthas/core/advisor/SpyImplTest.java new file mode 100644 index 000000000..047d32f6f --- /dev/null +++ b/core/src/test/java/com/taobao/arthas/core/advisor/SpyImplTest.java @@ -0,0 +1,28 @@ +package com.taobao.arthas.core.advisor; + +import org.assertj.core.api.Assertions; +import org.junit.Test; + +import com.taobao.arthas.core.util.StringUtils; + +/** + * + * @author hengyunabc 2021-07-14 + * + */ +public class SpyImplTest { + + @Test + public void testSplitMethodInfo() throws Throwable { + Assertions.assertThat(StringUtils.splitMethodInfo("a|b")).containsExactly("a", "b"); + Assertions.assertThat(StringUtils.splitMethodInfo("xxxxxxxxxx|fffffffffff")).containsExactly("xxxxxxxxxx", + "fffffffffff"); + } + + @Test + public void testSplitInvokeInfo() throws Throwable { + Assertions.assertThat(StringUtils.splitInvokeInfo("a|b|c")).containsExactly("a", "b", "c"); + Assertions.assertThat(StringUtils.splitInvokeInfo("xxxxxxxxxx|fffffffffff|yyy")).containsExactly("xxxxxxxxxx", + "fffffffffff", "yyy"); + } +}