■ ■ ■ ■ ■ ■
jadx-core/src/main/java/jadx/api/Decompiler.java
| skipped 53 lines |
54 | 54 | | |
55 | 55 | | private RootNode root; |
56 | 56 | | private List<IDexTreeVisitor> passes; |
| 57 | + | private List<JavaClass> classes; |
57 | 58 | | |
58 | 59 | | public Decompiler() { |
59 | 60 | | this.args = new DefaultJadxArgs(); |
| skipped 35 lines |
95 | 96 | | public void save() { |
96 | 97 | | try { |
97 | 98 | | ExecutorService ex = getSaveExecutor(); |
| 99 | + | ex.shutdown(); |
98 | 100 | | ex.awaitTermination(1, TimeUnit.DAYS); |
99 | 101 | | } catch (InterruptedException e) { |
100 | 102 | | LOG.error("Save interrupted", e); |
| skipped 21 lines |
122 | 124 | | } |
123 | 125 | | }); |
124 | 126 | | } |
125 | | - | executor.shutdown(); |
126 | 127 | | return executor; |
127 | 128 | | } |
128 | 129 | | |
129 | 130 | | public List<JavaClass> getClasses() { |
130 | | - | List<ClassNode> classNodeList = root.getClasses(false); |
131 | | - | List<JavaClass> classes = new ArrayList<JavaClass>(classNodeList.size()); |
132 | | - | for (ClassNode classNode : classNodeList) { |
133 | | - | classes.add(new JavaClass(this, classNode)); |
| 131 | + | if (classes == null) { |
| 132 | + | List<ClassNode> classNodeList = root.getClasses(false); |
| 133 | + | List<JavaClass> clsList = new ArrayList<JavaClass>(classNodeList.size()); |
| 134 | + | for (ClassNode classNode : classNodeList) { |
| 135 | + | clsList.add(new JavaClass(this, classNode)); |
| 136 | + | } |
| 137 | + | classes = Collections.unmodifiableList(clsList); |
134 | 138 | | } |
135 | | - | return Collections.unmodifiableList(classes); |
| 139 | + | return classes; |
136 | 140 | | } |
137 | 141 | | |
138 | 142 | | public List<JavaPackage> getPackages() { |
139 | | - | List<JavaClass> classes = getClasses(); |
140 | 143 | | Map<String, List<JavaClass>> map = new HashMap<String, List<JavaClass>>(); |
141 | | - | for (JavaClass javaClass : classes) { |
| 144 | + | for (JavaClass javaClass : getClasses()) { |
142 | 145 | | String pkg = javaClass.getPackage(); |
143 | 146 | | List<JavaClass> clsList = map.get(pkg); |
144 | 147 | | if (clsList == null) { |
| skipped 23 lines |
168 | 171 | | } |
169 | 172 | | |
170 | 173 | | void parse() throws DecodeException { |
171 | | - | ClassInfo.clearCache(); |
172 | | - | ErrorsCounter.reset(); |
173 | | - | |
| 174 | + | reset(); |
174 | 175 | | root = new RootNode(); |
175 | 176 | | LOG.info("loading ..."); |
176 | 177 | | root.load(inputFiles); |
177 | 178 | | } |
178 | 179 | | |
| 180 | + | private void reset() { |
| 181 | + | ClassInfo.clearCache(); |
| 182 | + | ErrorsCounter.reset(); |
| 183 | + | classes = null; |
| 184 | + | } |
| 185 | + | |
179 | 186 | | void processClass(ClassNode cls) { |
180 | 187 | | LOG.info("processing class {} ...", cls); |
181 | 188 | | ProcessClass.process(cls, passes); |
| skipped 1 lines |
183 | 190 | | |
184 | 191 | | RootNode getRoot() { |
185 | 192 | | return root; |
| 193 | + | } |
| 194 | + | |
| 195 | + | JavaClass findJavaClass(ClassNode cls) { |
| 196 | + | if (cls == null) { |
| 197 | + | return null; |
| 198 | + | } |
| 199 | + | for (JavaClass javaClass : getClasses()) { |
| 200 | + | if (javaClass.getClassNode().equals(cls)) { |
| 201 | + | return javaClass; |
| 202 | + | } |
| 203 | + | } |
| 204 | + | return null; |
186 | 205 | | } |
187 | 206 | | } |
188 | 207 | | |