OSDN Git Service

Upgrade to 4.2.0
[stew/Stew4.git] / src / net / argius / stew / DynamicLoader.java
1 package net.argius.stew;
2
3 import java.net.*;
4 import java.security.*;
5
6 /**
7  * DynamicLoader provides functions to load Class dynamically.
8  */
9 public final class DynamicLoader {
10
11     private DynamicLoader() {
12         // empty
13     }
14
15     /**
16      * Loads the Class specified by the name.
17      * @param <T>
18      * @param className
19      * @return
20      * @throws DynamicLoadingException
21      */
22     public static <T> Class<T> loadClass(String className) throws DynamicLoadingException {
23         return loadClass(className, ClassLoader.getSystemClassLoader());
24     }
25
26     /**
27      * Loads the Class specified by the name and ClassLoader.
28      * @param <T>
29      * @param className
30      * @param classLoader
31      * @return
32      * @throws DynamicLoadingException
33      */
34     public static <T> Class<T> loadClass(String className, ClassLoader classLoader) throws DynamicLoadingException {
35         try {
36             @SuppressWarnings("unchecked")
37             Class<T> c = (Class<T>)classLoader.loadClass(className);
38             return c;
39         } catch (Throwable th) {
40             throw new DynamicLoadingException("class loading error", th);
41         }
42     }
43
44     /**
45      * Creates a new instance.
46      * @param <T>
47      * @param className
48      * @return
49      * @throws DynamicLoadingException
50      */
51     public static <T> T newInstance(String className) throws DynamicLoadingException {
52         // T o = newInstance(className, DynamicLoader.class.getClassLoader());
53         @SuppressWarnings("unchecked")
54         T o = (T)newInstance(className, DynamicLoader.class.getClassLoader());
55         return o;
56     }
57
58     /**
59      * Creates a new instance.
60      * @param <T>
61      * @param className
62      * @param urls
63      * @return
64      * @throws DynamicLoadingException
65      */
66     public static <T> T newInstance(String className, URL... urls) throws DynamicLoadingException {
67         // T o = newInstance(className, getURLClassLoader(urls));
68         @SuppressWarnings("unchecked")
69         T o = (T)newInstance(className, getClassLoader(urls));
70         return o;
71     }
72
73     /**
74      * Creates a new instance.
75      * @param <T>
76      * @param className
77      * @param classLoader
78      * @return
79      * @throws DynamicLoadingException
80      */
81     public static <T> T newInstance(String className, ClassLoader classLoader) throws DynamicLoadingException {
82         try {
83             Class<T> c = loadClass(className, classLoader);
84             return c.newInstance();
85         } catch (DynamicLoadingException ex) {
86             throw ex;
87         } catch (Throwable th) {
88             throw new DynamicLoadingException("load error: " + className, th);
89         }
90     }
91
92     /**
93      * Creates a new instance.
94      * @param <T>
95      * @param classObject
96      * @return
97      * @throws DynamicLoadingException
98      */
99     public static <T> T newInstance(Class<T> classObject) throws DynamicLoadingException {
100         try {
101             return classObject.newInstance();
102         } catch (Throwable th) {
103             throw new DynamicLoadingException("load error: " + classObject, th);
104         }
105     }
106
107     /**
108      * Returns a new URLClassLoader that creates from URL.
109      * @param urls
110      * @return
111      */
112     public static URLClassLoader getClassLoader(URL... urls) {
113         return (URLClassLoader)AccessController.doPrivileged(new GettingURLClassLoaderPrivilegedAction(urls));
114     }
115
116     private static final class GettingURLClassLoaderPrivilegedAction implements PrivilegedAction<Object> {
117
118         private final URL[] urls;
119     
120         GettingURLClassLoaderPrivilegedAction(URL[] urls) {
121             this.urls = urls;
122         }
123     
124         @Override
125         public Object run() {
126             return new URLClassLoader(urls, ClassLoader.getSystemClassLoader());
127         }
128
129     }
130
131 }