diff --git a/jadx-core/src/main/java/jadx/api/Decompiler.java b/jadx-core/src/main/java/jadx/api/Decompiler.java index afa3a7f77..86970056b 100644 --- a/jadx-core/src/main/java/jadx/api/Decompiler.java +++ b/jadx-core/src/main/java/jadx/api/Decompiler.java @@ -54,6 +54,7 @@ public final class Decompiler { private RootNode root; private List passes; + private List classes; public Decompiler() { this.args = new DefaultJadxArgs(); @@ -95,6 +96,7 @@ public final class Decompiler { public void save() { try { ExecutorService ex = getSaveExecutor(); + ex.shutdown(); ex.awaitTermination(1, TimeUnit.DAYS); } catch (InterruptedException e) { LOG.error("Save interrupted", e); @@ -122,23 +124,24 @@ public final class Decompiler { } }); } - executor.shutdown(); return executor; } public List getClasses() { - List classNodeList = root.getClasses(false); - List classes = new ArrayList(classNodeList.size()); - for (ClassNode classNode : classNodeList) { - classes.add(new JavaClass(this, classNode)); + if (classes == null) { + List classNodeList = root.getClasses(false); + List clsList = new ArrayList(classNodeList.size()); + for (ClassNode classNode : classNodeList) { + clsList.add(new JavaClass(this, classNode)); + } + classes = Collections.unmodifiableList(clsList); } - return Collections.unmodifiableList(classes); + return classes; } public List getPackages() { - List classes = getClasses(); Map> map = new HashMap>(); - for (JavaClass javaClass : classes) { + for (JavaClass javaClass : getClasses()) { String pkg = javaClass.getPackage(); List clsList = map.get(pkg); if (clsList == null) { @@ -168,14 +171,18 @@ public final class Decompiler { } void parse() throws DecodeException { - ClassInfo.clearCache(); - ErrorsCounter.reset(); - + reset(); root = new RootNode(); LOG.info("loading ..."); root.load(inputFiles); } + private void reset() { + ClassInfo.clearCache(); + ErrorsCounter.reset(); + classes = null; + } + void processClass(ClassNode cls) { LOG.info("processing class {} ...", cls); ProcessClass.process(cls, passes); @@ -184,4 +191,16 @@ public final class Decompiler { RootNode getRoot() { return root; } + + JavaClass findJavaClass(ClassNode cls) { + if (cls == null) { + return null; + } + for (JavaClass javaClass : getClasses()) { + if (javaClass.getClassNode().equals(cls)) { + return javaClass; + } + } + return null; + } } diff --git a/jadx-core/src/main/java/jadx/api/JavaClass.java b/jadx-core/src/main/java/jadx/api/JavaClass.java index cbf2176b0..7d02b92d3 100644 --- a/jadx-core/src/main/java/jadx/api/JavaClass.java +++ b/jadx-core/src/main/java/jadx/api/JavaClass.java @@ -48,6 +48,10 @@ public final class JavaClass { } } + ClassNode getClassNode() { + return cls; + } + private void load() { int inClsCount = cls.getInnerClasses().size(); if (inClsCount != 0) { @@ -92,7 +96,7 @@ public final class JavaClass { } private Map getCodeAnnotations() { - getCode(); + decompile(); return cls.getCode().getAnnotations(); } @@ -108,13 +112,17 @@ public final class JavaClass { } else if (obj instanceof FieldNode) { clsNode = ((FieldNode) obj).getParentClass(); } - if (clsNode != null) { - clsNode = clsNode.getParentClass(); - JavaClass jCls = new JavaClass(decompiler, clsNode); - jCls.decompile(); - int defLine = ((LineAttrNode) obj).getDecompiledLine(); - return new CodePosition(jCls, defLine, 0); + if (clsNode == null) { + return null; } + clsNode = clsNode.getParentClass(); + JavaClass jCls = decompiler.findJavaClass(clsNode); + if (jCls == null) { + return null; + } + jCls.decompile(); + int defLine = ((LineAttrNode) obj).getDecompiledLine(); + return new CodePosition(jCls, defLine, 0); } return null; } diff --git a/jadx-gui/src/main/java/jadx/gui/JadxWrapper.java b/jadx-gui/src/main/java/jadx/gui/JadxWrapper.java index a1b5ba620..5901f9ab5 100644 --- a/jadx-gui/src/main/java/jadx/gui/JadxWrapper.java +++ b/jadx-gui/src/main/java/jadx/gui/JadxWrapper.java @@ -43,6 +43,7 @@ public class JadxWrapper { try { decompiler.setOutputDir(dir); ThreadPoolExecutor ex = decompiler.getSaveExecutor(); + ex.shutdown(); while (ex.isTerminating()) { long total = ex.getTaskCount(); long done = ex.getCompletedTaskCount(); diff --git a/jadx-gui/src/main/java/jadx/gui/treemodel/JClass.java b/jadx-gui/src/main/java/jadx/gui/treemodel/JClass.java index 9fee43817..4fc052930 100644 --- a/jadx-gui/src/main/java/jadx/gui/treemodel/JClass.java +++ b/jadx-gui/src/main/java/jadx/gui/treemodel/JClass.java @@ -45,8 +45,8 @@ public class JClass extends JNode { if (!loaded) { cls.decompile(); loaded = true; - update(); } + update(); } public synchronized void update() {