Skip to content

Commit d0df6b8

Browse files
authored
Merge pull request #288 from z529192557/master
修改类加载时间,将类加载时机提前到init阶段,同时恢复addTransformer时机
2 parents dbae17c + bc94354 commit d0df6b8

2 files changed

Lines changed: 30 additions & 7 deletions

File tree

sandbox-core/src/main/java/com/alibaba/jvm/sandbox/core/JvmSandbox.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,24 @@
99
import com.alibaba.jvm.sandbox.core.util.SpyUtils;
1010

1111
import java.lang.instrument.Instrumentation;
12+
import java.util.ArrayList;
13+
import java.util.List;
1214

1315
/**
1416
* 沙箱
1517
*/
1618
public class JvmSandbox {
1719

20+
/**
21+
* 需要提前加载的sandbox工具类
22+
*/
23+
private final static List<String> earlyLoadSandboxClassNameList = new ArrayList<String>();
24+
25+
static {
26+
earlyLoadSandboxClassNameList.add("com.alibaba.jvm.sandbox.core.util.SandboxClassUtils");
27+
earlyLoadSandboxClassNameList.add("com.alibaba.jvm.sandbox.core.util.matcher.structure.ClassStructureImplByAsm");
28+
}
29+
1830
private final CoreConfigure cfg;
1931
private final CoreModuleManager coreModuleManager;
2032

@@ -33,9 +45,22 @@ public JvmSandbox(final CoreConfigure cfg,
3345
}
3446

3547
private void init() {
48+
doEarlyLoadSandboxClass();
3649
SpyUtils.init(cfg.getNamespace());
3750
}
3851

52+
/**
53+
* 提前加载某些必要的类
54+
*/
55+
private void doEarlyLoadSandboxClass() {
56+
for(String className : earlyLoadSandboxClassNameList){
57+
try {
58+
Class.forName(className);
59+
} catch (ClassNotFoundException e) {
60+
//加载sandbox内部的类,不可能加载不到
61+
}
62+
}
63+
}
3964

4065
/**
4166
* 获取模块管理器

sandbox-core/src/main/java/com/alibaba/jvm/sandbox/core/manager/impl/DefaultModuleEventWatcher.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -83,14 +83,9 @@ private void finishProgress(final Progress progress, final int cCnt, final int m
8383
* 形变观察所影响的类
8484
*/
8585
private void reTransformClasses(
86-
SandboxClassFileTransformer transformer,
8786
final int watchId,
8887
final List<Class<?>> waitingReTransformClasses,
8988
final Progress progress) {
90-
// 在真正做retransform 前的一刻,做addTransformer,避免java.lang.ClassCircularityError
91-
if(null != transformer){
92-
inst.addTransformer(transformer, true);
93-
}
9489
// 需要形变总数
9590
final int total = waitingReTransformClasses.size();
9691

@@ -184,6 +179,9 @@ private int watch(final Matcher matcher,
184179
// 注册到CoreModule中
185180
coreModule.getSandboxClassFileTransformers().add(sandClassFileTransformer);
186181

182+
//这里addTransformer后,接下来引起的类加载都会经过sandClassFileTransformer
183+
inst.addTransformer(sandClassFileTransformer, true);
184+
187185
// 查找需要渲染的类集合
188186
final List<Class<?>> waitingReTransformClasses = classDataSource.findForReTransform(matcher);
189187
logger.info("watch={} in module={} found {} classes for watch(ing).",
@@ -199,7 +197,7 @@ private int watch(final Matcher matcher,
199197
try {
200198

201199
// 应用JVM
202-
reTransformClasses(sandClassFileTransformer,watchId, waitingReTransformClasses, progress);
200+
reTransformClasses(watchId,waitingReTransformClasses, progress);
203201

204202
// 计数
205203
cCnt += sandClassFileTransformer.getAffectStatistic().cCnt();
@@ -266,7 +264,7 @@ public void delete(final int watcherId,
266264
beginProgress(progress, waitingReTransformClasses.size());
267265
try {
268266
// 应用JVM
269-
reTransformClasses(null, watcherId, waitingReTransformClasses, progress);
267+
reTransformClasses(watcherId, waitingReTransformClasses, progress);
270268
} finally {
271269
finishProgress(progress, cCnt, mCnt);
272270
}

0 commit comments

Comments
 (0)