1 package remoteTester.runner.server;
2
3 import java.util.HashMap;
4 import java.util.Map;
5
6 /***
7 * Created by Nicolas FRANK
8 * @mail: nicolas.frank@laposte.net
9 * Date: Oct 18, 2002
10 * Time: 11:16:50 AM
11 */
12
13 /***
14 * This class loader instanciate classes provided as a byte array
15 */
16 public class ByteClassLoader extends ClassLoader {
17
18 /***
19 * main class byte stream (todo : could be moved into the hashMap)
20 */
21 private byte[] classAsByte;
22 /***
23 * main class (todo : could be moved into the hashMap)
24 */
25 private String className;
26 /***
27 * list of helper classes
28 */
29 private Map helperClasses = new HashMap();
30
31 /***
32 * This class loader allows to load the Class provided as a byte array in the current JVM
33 *
34 * @param classAsByte
35 * @param className
36 */
37 public ByteClassLoader(byte[] classAsByte, String className) {
38
39 this.classAsByte = classAsByte;
40 this.className = className;
41 }
42
43 /***
44 * This class loader allows to load the Class provided as a byte array in the current JVM
45 *
46 * @param classAsByte an array of byte that allows to create a class
47 * @param className the class name
48 * @param helperClassesAsBytes helper classes definition as byte arrays
49 * @param helperClasseNames helper classes names
50 */
51 public ByteClassLoader(byte[] classAsByte, String className, byte[][] helperClassesAsBytes, String[] helperClasseNames) {
52
53 this.classAsByte = classAsByte;
54 this.className = className;
55
56 if (helperClasseNames != null) {
57 // put classes definition into map
58 for (int i = 0; i < helperClasseNames.length; i++) {
59 helperClasses.put(helperClasseNames[i], helperClassesAsBytes[i]);
60 }
61 }
62 }
63
64 /***
65 * this should be the prefered method to load the class that was defined in the constructor
66 *
67 * @return the Class loaded
68 * @throws java.lang.ClassNotFoundException
69 *
70 */
71 public synchronized Class loadClass() throws ClassNotFoundException {
72 return loadClass(className, false);
73 }
74
75
76 /***
77 * overrride the default class loader mechanism
78 *
79 * @param className class to load
80 * @param resolve need to resolve
81 * @return The Class loaded
82 * @throws ClassNotFoundException
83 */
84 protected synchronized Class loadClass(String className, boolean resolve)
85 throws ClassNotFoundException {
86 Class resultClass = null;
87
88
89 if (!className.equals(this.className)) {
90 // now I support helper classes (mock objects...)
91 if (helperClasses.containsKey(className)) {
92
93 resultClass = defineClass(className, (byte[]) helperClasses.get(className), 0, ((byte[]) helperClasses.get(className)).length);
94 // resolve if necessary
95 if (resolve) {
96 resolveClass(resultClass);
97 }
98
99 return resultClass;
100 }
101
102 ClassLoader parentClassLoader = null;
103 try {
104 // deleguate other class loading to parent classloader
105 parentClassLoader = getClass().getClassLoader();
106 resultClass = parentClassLoader.loadClass(className);
107 return resultClass;
108 } catch (ClassNotFoundException e) {
109 System.out.println("failed loading " + className + " using parent classloader (" + parentClassLoader.getClass().getName() + ")!");
110 throw new ClassNotFoundException();
111 }
112 }
113
114 resultClass = defineClass(className, classAsByte, 0, classAsByte.length);
115
116 // resolve if necessary
117 if (resolve) {
118 resolveClass(resultClass);
119 }
120
121 return resultClass;
122 }
123 }
This page was automatically generated by Maven