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");
+ }
+}