From 775b342ab3dabc0f1074bd05a9b3db4b1a15a7ce Mon Sep 17 00:00:00 2001 From: hengyunabc Date: Wed, 14 Nov 2018 18:45:46 +0800 Subject: [PATCH] fix jad command do not match inner class. close #301 --- .../arthas/core/command/klass100/JadCommand.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/com/taobao/arthas/core/command/klass100/JadCommand.java b/core/src/main/java/com/taobao/arthas/core/command/klass100/JadCommand.java index 4a4c37869..6ab325aee 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/klass100/JadCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/klass100/JadCommand.java @@ -93,8 +93,12 @@ public class JadCommand extends AnnotatedCommand { processNoMatch(process); } else if (matchedClasses.size() > 1) { processMatches(process, matchedClasses); - } else { - Set> withInnerClasses = SearchUtils.searchClassOnly(inst, classPattern + "(?!.*\\$\\$Lambda\\$).*", true, code); + } else { // matchedClasses size is 1 + // find inner classes. TODO slow + Set> withInnerClasses = SearchUtils.searchClassOnly(inst, matchedClasses.iterator().next().getName() + "(?!.*\\$\\$Lambda\\$).*", true, code); + if(withInnerClasses.isEmpty()) { + withInnerClasses = matchedClasses; + } processExactMatch(process, affect, inst, matchedClasses, withInnerClasses); } } finally { @@ -105,11 +109,12 @@ public class JadCommand extends AnnotatedCommand { private void processExactMatch(CommandProcess process, RowAffect affect, Instrumentation inst, Set> matchedClasses, Set> withInnerClasses) { Class c = matchedClasses.iterator().next(); - matchedClasses = withInnerClasses; + Set> allClasses = new HashSet>(withInnerClasses); + allClasses.add(c); try { - ClassDumpTransformer transformer = new ClassDumpTransformer(matchedClasses); - Enhancer.enhance(inst, transformer, matchedClasses); + ClassDumpTransformer transformer = new ClassDumpTransformer(allClasses); + Enhancer.enhance(inst, transformer, allClasses); Map, File> classFiles = transformer.getDumpResult(); File classFile = classFiles.get(c);