1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// NewInstance.java - create a new instance of a class by name. 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// http://www.saxproject.org 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// Written by Edwin Goei, edwingo@apache.org 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// and by David Brownell, dbrownell@users.sourceforge.net 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// NO WARRANTY! This class is in the Public Domain. 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// $Id: NewInstance.java,v 1.4 2002/01/30 20:52:27 dbrownell Exp $ 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage org.xml.sax.helpers; 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.lang.reflect.InvocationTargetException; 117365de1056414750d0a7d1fdd26025fd247f0d04Jesse Wilsonimport java.lang.reflect.Method; 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Create a new instance of a class by name. 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote> 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>This module, both source code and documentation, is in the 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em> 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a> 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * for further information. 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote> 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>This class contains a static method for creating an instance of a 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * class from an explicit class name. It tries to use the thread's context 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ClassLoader if possible and falls back to using 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class.forName(String).</p> 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>This code is designed to compile and run on JDK version 1.1 and later 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * including versions of Java 2.</p> 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @author Edwin Goei, David Brownell 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @version 2.0.1 (sax2r2) 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectclass NewInstance { 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new instance of the specified class name 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Package private so this code is not exposed at the API level. 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static Object newInstance (ClassLoader classLoader, String className) 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws ClassNotFoundException, IllegalAccessException, 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InstantiationException 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Class driverClass; 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (classLoader == null) { 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project driverClass = Class.forName(className); 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project driverClass = classLoader.loadClass(className); 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return driverClass.newInstance(); 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Figure out which ClassLoader to use. For JDK 1.2 and later use 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the context ClassLoader. 57f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes */ 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static ClassLoader getClassLoader () 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Method m = null; 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project m = Thread.class.getMethod("getContextClassLoader"); 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (NoSuchMethodException e) { 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Assume that we are running JDK 1.1, use the current ClassLoader 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return NewInstance.class.getClassLoader(); 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (ClassLoader) m.invoke(Thread.currentThread()); 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IllegalAccessException e) { 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // assert(false) 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnknownError(e.getMessage()); 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (InvocationTargetException e) { 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // assert(e.getTargetException() instanceof SecurityException) 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnknownError(e.getMessage()); 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 80