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