1 /* 2 * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 package evalexpr; 25 26 import java.util.Map; 27 28 /** 29 * A class loader which loads classes from byte arrays. 30 * 31 * <p><b>This is NOT part of any supported API. 32 * If you write code that depends on this, you do so at your own 33 * risk. This code and its internal interfaces are subject to change 34 * or deletion without notice.</b></p> 35 * @author Peter von der Ahé 36 */ 37 public class ByteArrayClassLoader extends ClassLoader { 38 /** 39 * Maps binary class names to class files stored as byte arrays. 40 */ 41 private Map<String, byte[]> classes; 42 43 /** 44 * Creates a new instance of ByteArrayClassLoader 45 * @param classes a map from binary class names to class files stored as byte arrays 46 */ ByteArrayClassLoader(Map<String, byte[]> classes)47 public ByteArrayClassLoader(Map<String, byte[]> classes) { 48 this.classes = classes; 49 } 50 51 @Override loadClass(String name)52 public Class<?> loadClass(String name) throws ClassNotFoundException { 53 try { 54 return super.loadClass(name); 55 } catch (ClassNotFoundException e) { 56 byte[] classData = classes.get(name); 57 return defineClass(name, classData, 0, classData.length); 58 } 59 } 60 } 61