1
+ <%@ page import =" java.lang.reflect.Method" %>
2
+ <%@ page import =" java.lang.reflect.Proxy" %>
3
+ <%!
4
+ public static Class<?> defineByProxy(String className, byte [] classBytes) throws Exception {
5
+
6
+ // 获取系统的类加载器,可以根据具体情况换成一个存在的类加载器
7
+ ClassLoader classLoader = ClassLoader . getSystemClassLoader();
8
+
9
+ // 反射java.lang.reflect.Proxy类获取其中的defineClass0方法
10
+ Method method = Proxy . class. getDeclaredMethod(" defineClass0" ,
11
+ ClassLoader . class, String . class, byte []. class, int . class, int . class);
12
+ // 修改方法的访问权限
13
+ method. setAccessible(true );
14
+
15
+ // 反射调用java.lang.reflect.Proxy.defineClass0()方法,动态向JVM注册对象
16
+ // 返回一个 Class 对象
17
+ return (Class<?> ) method. invoke(null , classLoader, className, classBytes, 0 , classBytes. length);
18
+ }
19
+ % >
20
+ <%
21
+ String CLASS_NAME = " org.su18.serialize.test.proxy.SuTestClass" ;
22
+ byte [] CLASS_BYTES = new byte []{- 54 , - 2 , - 70 , - 66 , 0 , 0 , 0 , 51 , 0 , 20 , 10 , 0 , 4 , 0 , 16 , 8 , 0 , 17 , 7 ,
23
+ 0 , 18 , 7 , 0 , 19 , 1 , 0 , 6 , 60 , 105 , 110 , 105 , 116 , 62 , 1 , 0 , 3 , 40 , 41 , 86 , 1 , 0 , 4 , 67 , 111 , 100 , 101 , 1 , 0 ,
24
+ 15 , 76 , 105 , 110 , 101 , 78 , 117 , 109 , 98 , 101 , 114 , 84 , 97 , 98 , 108 , 101 , 1 , 0 , 18 , 76 , 111 , 99 , 97 , 108 , 86 ,
25
+ 97 , 114 , 105 , 97 , 98 , 108 , 101 , 84 , 97 , 98 , 108 , 101 , 1 , 0 , 4 , 116 , 104 , 105 , 115 , 1 , 0 , 43 , 76 , 111 , 114 ,
26
+ 103 , 47 , 115 , 117 , 49 , 56 , 47 , 115 , 101 , 114 , 105 , 97 , 108 , 105 , 122 , 101 , 47 , 116 , 101 , 115 , 116 , 47 , 112 ,
27
+ 114 , 111 , 120 , 121 , 47 , 83 , 117 , 84 , 101 , 115 , 116 , 67 , 108 , 97 , 115 , 115 , 59 , 1 , 0 , 6 , 99 , 97 , 108 , 108 ,
28
+ 77 , 101 , 1 , 0 , 20 , 40 , 41 , 76 , 106 , 97 , 118 , 97 , 47 , 108 , 97 , 110 , 103 , 47 , 83 , 116 , 114 , 105 , 110 , 103 , 59 ,
29
+ 1 , 0 , 10 , 83 , 111 , 117 , 114 , 99 , 101 , 70 , 105 , 108 , 101 , 1 , 0 , 16 , 83 , 117 , 84 , 101 , 115 , 116 , 67 , 108 , 97 ,
30
+ 115 , 115 , 46 , 106 , 97 , 118 , 97 , 12 , 0 , 5 , 0 , 6 , 1 , 0 , 43 , 67 , 97 , 108 , 108 , 32 , 77 , 101 , 32 , 66 , 121 , 32 ,
31
+ 89 , 111 , 117 , 114 , 32 , 72 , 101 , 97 , 114 , 116 , 44 , 65 , 110 , 100 , 32 , 73 , 32 , 83 , 104 , 97 , 108 , 108 , 32 , 66 ,
32
+ 101 , 32 , 84 , 104 , 101 , 114 , 101 , 46 , 1 , 0 , 41 , 111 , 114 , 103 , 47 , 115 , 117 , 49 , 56 , 47 , 115 , 101 , 114 , 105 ,
33
+ 97 , 108 , 105 , 122 , 101 , 47 , 116 , 101 , 115 , 116 , 47 , 112 , 114 , 111 , 120 , 121 , 47 , 83 , 117 , 84 , 101 , 115 , 116 ,
34
+ 67 , 108 , 97 , 115 , 115 , 1 , 0 , 16 , 106 , 97 , 118 , 97 , 47 , 108 , 97 , 110 , 103 , 47 , 79 , 98 , 106 , 101 , 99 , 116 , 0 ,
35
+ 33 , 0 , 3 , 0 , 4 , 0 , 0 , 0 , 0 , 0 , 2 , 0 , 1 , 0 , 5 , 0 , 6 , 0 , 1 , 0 , 7 , 0 , 0 , 0 , 47 , 0 , 1 , 0 , 1 , 0 , 0 , 0 , 5 , 42 ,
36
+ - 73 , 0 , 1 , - 79 , 0 , 0 , 0 , 2 , 0 , 8 , 0 , 0 , 0 , 6 , 0 , 1 , 0 , 0 , 0 , 6 , 0 , 9 , 0 , 0 , 0 , 12 , 0 , 1 , 0 , 0 , 0 , 5 , 0 , 10 ,
37
+ 0 , 11 , 0 , 0 , 0 , 9 , 0 , 12 , 0 , 13 , 0 , 1 , 0 , 7 , 0 , 0 , 0 , 27 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 3 , 18 , 2 , - 80 , 0 , 0 , 0 , 1 , 0 ,
38
+ 8 , 0 , 0 , 0 , 6 , 0 , 1 , 0 , 0 , 0 , 9 , 0 , 1 , 0 , 14 , 0 , 0 , 0 , 2 , 0 , 15 };
39
+
40
+ Class<?> testClass = defineByProxy(CLASS_NAME , CLASS_BYTES );
41
+
42
+ Method m = testClass. getDeclaredMethod(" callMe" );
43
+ System . out. println(m. invoke(testClass));
44
+ % >
0 commit comments