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