1 /* 2 * Javassist, a Java-bytecode translator toolkit. 3 * Copyright (C) 1999-2007 Shigeru Chiba. All Rights Reserved. 4 * 5 * The contents of this file are subject to the Mozilla Public License Version 6 * 1.1 (the "License"); you may not use this file except in compliance with 7 * the License. Alternatively, the contents of this file may be used under 8 * the terms of the GNU Lesser General Public License Version 2.1 or later. 9 * 10 * Software distributed under the License is distributed on an "AS IS" basis, 11 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 12 * for the specific language governing rights and limitations under the 13 * License. 14 */ 15 16 package javassist; 17 18 import java.io.*; 19 import java.net.URL; 20 import java.net.MalformedURLException; 21 22 /** 23 * A <code>ByteArrayClassPath</code> contains bytes that is served as 24 * a class file to a <code>ClassPool</code>. It is useful to convert 25 * a byte array to a <code>CtClass</code> object. 26 * 27 * <p>For example, if you want to convert a byte array <code>b</code> 28 * into a <code>CtClass</code> object representing the class with a name 29 * <code>classname</code>, then do as following: 30 * 31 * <ul><pre> 32 * ClassPool cp = ClassPool.getDefault(); 33 * cp.insertClassPath(new ByteArrayClassPath(classname, b)); 34 * CtClass cc = cp.get(classname); 35 * </pre></ul> 36 * 37 * <p>The <code>ClassPool</code> object <code>cp</code> uses the created 38 * <code>ByteArrayClassPath</code> object as the source of the class file. 39 * 40 * <p>A <code>ByteArrayClassPath</code> must be instantiated for every 41 * class. It contains only a single class file. 42 * 43 * @see javassist.ClassPath 44 * @see ClassPool#insertClassPath(ClassPath) 45 * @see ClassPool#appendClassPath(ClassPath) 46 * @see ClassPool#makeClass(InputStream) 47 */ 48 public class ByteArrayClassPath implements ClassPath { 49 protected String classname; 50 protected byte[] classfile; 51 52 /* 53 * Creates a <code>ByteArrayClassPath</code> containing the given 54 * bytes. 55 * 56 * @param name a fully qualified class name 57 * @param classfile the contents of a class file. 58 */ ByteArrayClassPath(String name, byte[] classfile)59 public ByteArrayClassPath(String name, byte[] classfile) { 60 this.classname = name; 61 this.classfile = classfile; 62 } 63 64 /** 65 * Closes this class path. 66 */ close()67 public void close() {} 68 toString()69 public String toString() { 70 return "byte[]:" + classname; 71 } 72 73 /** 74 * Opens the class file. 75 */ openClassfile(String classname)76 public InputStream openClassfile(String classname) { 77 if(this.classname.equals(classname)) 78 return new ByteArrayInputStream(classfile); 79 else 80 return null; 81 } 82 83 /** 84 * Obtains the URL. 85 */ find(String classname)86 public URL find(String classname) { 87 if(this.classname.equals(classname)) { 88 String cname = classname.replace('.', '/') + ".class"; 89 try { 90 // return new File(cname).toURL(); 91 return new URL("file:/ByteArrayClassPath/" + cname); 92 } 93 catch (MalformedURLException e) {} 94 } 95 96 return null; 97 } 98 } 99