2
2
3
3
import com .alibaba .jvm .sandbox .api .event .Event ;
4
4
import com .alibaba .jvm .sandbox .core .enhance .weaver .asm .EventWeaver ;
5
+ import com .alibaba .jvm .sandbox .core .util .AsmUtils ;
5
6
import com .alibaba .jvm .sandbox .core .util .ObjectIDs ;
6
7
import org .objectweb .asm .ClassReader ;
7
8
import org .objectweb .asm .ClassWriter ;
8
9
import org .slf4j .Logger ;
9
10
import org .slf4j .LoggerFactory ;
10
11
12
+ import java .io .File ;
13
+ import java .io .IOException ;
11
14
import java .util .Set ;
12
15
13
- import static com .alibaba .jvm .sandbox .core .util .SandboxStringUtils .toInternalClassName ;
14
- import static com .alibaba .jvm .sandbox .core .util .SandboxStringUtils .toJavaClassName ;
16
+ import static org .apache .commons .io .FileUtils .writeByteArrayToFile ;
15
17
import static org .objectweb .asm .ClassReader .EXPAND_FRAMES ;
16
18
import static org .objectweb .asm .ClassWriter .COMPUTE_FRAMES ;
17
19
import static org .objectweb .asm .ClassWriter .COMPUTE_MAXS ;
18
20
import static org .objectweb .asm .Opcodes .ASM7 ;
19
21
20
22
/**
21
23
* 事件代码增强器
22
- * Created by [email protected] on 16/7/12.
24
+ *
25
+
23
26
*/
24
27
public class EventEnhancer implements Enhancer {
25
28
@@ -46,57 +49,42 @@ private ClassWriter createClassWriter(final ClassLoader targetClassLoader,
46
49
*/
47
50
@ Override
48
51
protected String getCommonSuperClass (String type1 , String type2 ) {
49
- Class <?> c , d ;
50
- try {
51
- c = Class .forName (toJavaClassName (type1 ), false , targetClassLoader );
52
- d = Class .forName (toJavaClassName (type2 ), false , targetClassLoader );
53
- } catch (Exception e ) {
54
- throw new RuntimeException (e );
55
- }
56
- if (c .isAssignableFrom (d )) {
57
- return type1 ;
58
- }
59
- if (d .isAssignableFrom (c )) {
60
- return type2 ;
61
- }
62
- if (c .isInterface () || d .isInterface ()) {
63
- return "java/lang/Object" ;
64
- } else {
65
- do {
66
- c = c .getSuperclass ();
67
- } while (!c .isAssignableFrom (d ));
68
- return toInternalClassName (c .getName ());
69
- }
52
+ return AsmUtils .getCommonSuperClass (type1 , type2 , targetClassLoader );
70
53
}
71
54
72
55
};
73
56
}
74
57
75
- // /*
76
- // * dump class to file
77
- // * 用于代码调试
78
- // */
79
- // private static byte[] dumpClassIfNecessary(String className, byte[] data) {
80
- // final File dumpClassFile = new File("./sandbox-class-dump/" + className + ".class");
81
- // final File classPath = new File(dumpClassFile.getParent());
82
- //
83
- // // 创建类所在的包路径
84
- // if (!classPath.mkdirs()
85
- // && !classPath.exists()) {
86
- // logger.warn("create dump classpath={} failed.", classPath);
87
- // return data;
88
- // }
89
- //
90
- // // 将类字节码写入文件
91
- // try {
92
- // writeByteArrayToFile(dumpClassFile, data);
93
- // logger.info("dump {} to {} success.", className, dumpClassFile);
94
- // } catch (IOException e) {
95
- // logger.warn("dump {} to {} failed.", className, dumpClassFile, e);
96
- // }
97
- //
98
- // return data;
99
- // }
58
+ private static final boolean isDumpClass = false ;
59
+
60
+ /*
61
+ * dump class to file
62
+ * 用于代码调试
63
+ */
64
+ private static byte [] dumpClassIfNecessary (String className , byte [] data ) {
65
+ if (!isDumpClass ) {
66
+ return data ;
67
+ }
68
+ final File dumpClassFile = new File ("./sandbox-class-dump/" + className + ".class" );
69
+ final File classPath = new File (dumpClassFile .getParent ());
70
+
71
+ // 创建类所在的包路径
72
+ if (!classPath .mkdirs ()
73
+ && !classPath .exists ()) {
74
+ logger .warn ("create dump classpath={} failed." , classPath );
75
+ return data ;
76
+ }
77
+
78
+ // 将类字节码写入文件
79
+ try {
80
+ writeByteArrayToFile (dumpClassFile , data );
81
+ logger .info ("dump {} to {} success." , className , dumpClassFile );
82
+ } catch (IOException e ) {
83
+ logger .warn ("dump {} to {} failed." , className , dumpClassFile , e );
84
+ }
85
+
86
+ return data ;
87
+ }
100
88
101
89
@ Override
102
90
public byte [] toByteCodeArray (final ClassLoader targetClassLoader ,
@@ -119,7 +107,7 @@ public byte[] toByteCodeArray(final ClassLoader targetClassLoader,
119
107
),
120
108
EXPAND_FRAMES
121
109
);
122
- return cw .toByteArray ();
110
+ return dumpClassIfNecessary ( cr . getClassName (), cw .toByteArray () );
123
111
}
124
112
125
113
}
0 commit comments