Skip to content

Commit 1b80679

Browse files
committed
feat: 重构IastClassDiagram
1 parent c5c7a47 commit 1b80679

File tree

8 files changed

+330
-148
lines changed

8 files changed

+330
-148
lines changed

dongtai-core/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,11 @@
264264
<scope>test</scope>
265265
</dependency>
266266
-->
267+
<dependency>
268+
<groupId>org.openjdk.jmh</groupId>
269+
<artifactId>jmh-generator-annprocess</artifactId>
270+
<scope>test</scope>
271+
</dependency>
267272
</dependencies>
268273

269274
</project>

dongtai-core/src/main/java/io/dongtai/iast/core/bytecode/IastClassFileTransformer.java

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
import io.dongtai.log.DongTaiLog;
1717
import io.dongtai.log.ErrorCode;
1818
import org.apache.commons.lang3.time.StopWatch;
19-
import org.objectweb.asm.*;
19+
import org.objectweb.asm.ClassReader;
20+
import org.objectweb.asm.ClassVisitor;
21+
import org.objectweb.asm.ClassWriter;
2022

2123
import java.io.File;
2224
import java.lang.dongtai.SpyDispatcherHandler;
@@ -27,9 +29,12 @@
2729
import java.security.CodeSource;
2830
import java.security.ProtectionDomain;
2931
import java.util.*;
32+
import java.util.concurrent.ConcurrentHashMap;
33+
import java.util.concurrent.ConcurrentSkipListSet;
3034

3135
import static org.apache.commons.io.FileUtils.writeByteArrayToFile;
32-
import static org.objectweb.asm.ClassWriter.*;
36+
import static org.objectweb.asm.ClassWriter.COMPUTE_FRAMES;
37+
import static org.objectweb.asm.ClassWriter.COMPUTE_MAXS;
3338

3439
/**
3540
@@ -119,6 +124,8 @@ public byte[] transform(final ClassLoader loader,
119124
final Class<?> classBeingRedefined,
120125
final ProtectionDomain protectionDomain,
121126
final byte[] srcByteCodeArray) {
127+
128+
// TODO 那下面这段逻辑是否就可以去掉了?
122129
String threadName = Thread.currentThread().getName();
123130
if (threadName.startsWith("DongTai-IAST-Core")) {
124131
return null;
@@ -172,12 +179,10 @@ public byte[] transform(final ClassLoader loader,
172179
}
173180
final String className = classContext.getClassName();
174181

175-
Set<String> ancestors = classDiagram.getDiagram(className);
182+
// 设置类的祖先类
183+
Set<String> ancestors = classDiagram.getClassAncestorSet(className);
176184
if (ancestors == null) {
177-
classDiagram.setLoader(loader);
178-
classDiagram.saveAncestors(className, classContext.getSuperClassName(), classContext.getInterfaces());
179-
ancestors = classDiagram.getAncestors(className, classContext.getSuperClassName(),
180-
classContext.getInterfaces());
185+
ancestors = classDiagram.updateAncestorsByClassContext(loader, classContext);
181186
}
182187
classContext.setAncestors(ancestors);
183188

@@ -288,9 +293,9 @@ public Class<?>[] findForRetransform() {
288293
continue;
289294
}
290295
String className = clazz.getName();
291-
Set<String> diagram = classDiagram.getDiagram(className);
296+
Set<String> diagram = classDiagram.getClassAncestorSet(className);
292297
if (diagram == null) {
293-
diagram = new HashSet<String>();
298+
diagram = ConcurrentHashMap.newKeySet();
294299
Queue<Class<?>> classQueue = new LinkedList<Class<?>>();
295300

296301
classQueue.add(clazz);
@@ -305,7 +310,7 @@ public Class<?>[] findForRetransform() {
305310
Class<?>[] interfaces = currentClazz.getInterfaces();
306311
Collections.addAll(classQueue, interfaces);
307312
}
308-
classDiagram.setDiagram(className, diagram);
313+
classDiagram.setClassAncestorSet(className, diagram);
309314
}
310315
for (String clazzName : diagram) {
311316
if (this.policyManager.isHookClass(clazzName) ||

0 commit comments

Comments
 (0)