001 /* 002 * $Id: ReflectorLoader.java 4542 2006-12-21 19:01:02Z blackdrag $ 003 * 004 * Copyright 2003 (C) Jochen Theodorou. All Rights Reserved. 005 * 006 * Redistribution and use of this software and associated documentation 007 * ("Software"), with or without modification, are permitted provided that the 008 * following conditions are met: 1. Redistributions of source code must retain 009 * copyright statements and notices. Redistributions must also contain a copy 010 * of this document. 2. Redistributions in binary form must reproduce the above 011 * copyright notice, this list of conditions and the following disclaimer in 012 * the documentation and/or other materials provided with the distribution. 3. 013 * The name "groovy" must not be used to endorse or promote products derived 014 * from this Software without prior written permission of The Codehaus. For 015 * written permission, please contact info@codehaus.org. 4. Products derived 016 * from this Software may not be called "groovy" nor may "groovy" appear in 017 * their names without prior written permission of The Codehaus. "groovy" is a 018 * registered trademark of The Codehaus. 5. Due credit should be given to The 019 * Codehaus - http://groovy.codehaus.org/ 020 * 021 * THIS SOFTWARE IS PROVIDED BY THE CODEHAUS AND CONTRIBUTORS ``AS IS'' AND ANY 022 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 023 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 024 * DISCLAIMED. IN NO EVENT SHALL THE CODEHAUS OR ITS CONTRIBUTORS BE LIABLE FOR 025 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 026 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 027 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 028 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 029 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 030 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH 031 * DAMAGE. 032 * 033 */ 034 package org.codehaus.groovy.runtime; 035 036 import java.security.ProtectionDomain; 037 import java.util.HashMap; 038 039 /** 040 * Reflector creation helper. This class is used to define the Refloctor classes. 041 * For each ClassLoader such a Loader will be created by the MetaClass. 042 * The only special about this loader is, that it knows the class Reflector, 043 * which is the base class of all runtime created Reflectors. 044 * 045 * @author <a href="mailto:blackdrag@gmx.org">Jochen Theodorou</a> 046 * @version $Revision: 4542 $ 047 */ 048 public class ReflectorLoader extends ClassLoader { 049 private HashMap loadedClasses = new HashMap(); 050 051 /** 052 * returns the Reflector class. 053 * 054 * @return the Reflector class if the name matches 055 * @throws ClassNotFoundException if the name is not matching Reflector 056 * @see Reflector 057 */ 058 protected Class findClass(String name) throws ClassNotFoundException { 059 if (delegatationLoader==null) return super.loadClass(name); 060 return delegatationLoader.loadClass(name); 061 } 062 063 /** 064 * helper method to define Reflector classes 065 * @param name of the Reflector 066 * @param bytecode the bytecode 067 * @param domain the protection domain 068 * @return the generated class 069 */ 070 public Class defineClass(String name, byte[] bytecode, ProtectionDomain domain) { 071 Class c = defineClass(name, bytecode, 0, bytecode.length, domain); 072 synchronized(loadedClasses) { loadedClasses.put(name,c); } 073 resolveClass(c); 074 return c; 075 } 076 077 /** 078 * creates a RelfectorLoader. 079 * @param parent the parent loader. This should never be null! 080 */ 081 public ReflectorLoader(ClassLoader parent) { 082 super(parent); 083 delegatationLoader = getClass().getClassLoader(); 084 } 085 086 public Class getLoadedClass(String name) { 087 synchronized (loadedClasses) { 088 return (Class)loadedClasses.get(name); 089 } 090 } 091 092 private ClassLoader delegatationLoader; 093 }