author | Jan Vrany <jan.vrany@fit.cvut.cz> |
Mon, 11 Aug 2014 10:55:57 +0100 | |
changeset 3218 | 93a3efa06bd1 |
child 3305 | d85c559c01c6 |
permissions | -rw-r--r-- |
3218
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
1 |
/** |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
2 |
* |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
3 |
*/ |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
4 |
package stx.libjava.tools.environment.internal; |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
5 |
|
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
6 |
import java.lang.reflect.Field; |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
7 |
import java.util.Iterator; |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
8 |
import java.util.Vector; |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
9 |
|
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
10 |
|
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
11 |
/** |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
12 |
* <code>ReflectiveClassLoader</code> is a simple wrapper on a {@link java.lang.ClassLoader} that provides |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
13 |
* reflective features standard {@link java.lang.ClassLoader} doesn't. |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
14 |
* In particular, it provides {@link #isPackage(String)} which is used |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
15 |
* by {@link stx.libjava.tools.environment.ReflectiveEnvironment}. |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
16 |
* |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
17 |
* The way {@link java.lang.ClassLoader} accesses and loads classes differ |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
18 |
* so specialised subclasses exists for individual {@link java.lang.ClassLoader} |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
19 |
* instances in order to provide more accurate answers. Therefore use method |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
20 |
* {@link #forClassLoader(ClassLoader)} to create an instance of a |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
21 |
* <code>ReflectiveClassLoader</code> |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
22 |
* |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
23 |
* @author Jan Vrany <jan.vrany [at] fit.cvut.cz> |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
24 |
* |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
25 |
*/ |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
26 |
@stx.libjava.annotation.Package("stx:libjava/tools") |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
27 |
public class ReflectiveClassLoader { |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
28 |
/** |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
29 |
* Shared cached {@link ReflectiveClassLoader} representing primordial class loader. |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
30 |
* Primordial class loader is not to change during the life-span of a JVM, so it can be |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
31 |
* safely cached. |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
32 |
* |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
33 |
*/ |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
34 |
protected static ReflectiveClassLoader PRIMORDIAL = new ReflectiveURLClassLoader(null, sun.misc.Launcher.getBootstrapClassPath().getURLs()); |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
35 |
|
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
36 |
/** |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
37 |
* Cached {@link Field} to access normally inaccessible field {@link java.lang.ClassLoader#classes}. |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
38 |
* On OpenJDK based libraries, this field contains a list of loaded classes. This list is used |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
39 |
* to check for loaded classes as a short-circuit (or as the only way for generic class loaders) |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
40 |
*/ |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
41 |
protected static Field FIELD_ClassLoader_Classes; |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
42 |
|
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
43 |
/** |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
44 |
* A real {@link ClassLoader} this {@link ReflectiveClassLoader} reflects on. |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
45 |
* For primordial class loader the value is <code>null</code>. |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
46 |
*/ |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
47 |
protected ClassLoader realClassLoader; |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
48 |
|
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
49 |
/** |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
50 |
* A cached {@link ReflectiveClassLoader} representing a parent class loader of |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
51 |
* this object. For primordial class loader the value is <code>null</code>. |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
52 |
*/ |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
53 |
protected ReflectiveClassLoader parent; |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
54 |
|
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
55 |
protected ReflectiveClassLoader(ClassLoader loader) { |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
56 |
realClassLoader = loader; |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
57 |
} |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
58 |
|
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
59 |
static { |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
60 |
try { |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
61 |
FIELD_ClassLoader_Classes = ClassLoader.class.getDeclaredField("classes"); |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
62 |
FIELD_ClassLoader_Classes.setAccessible(true); |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
63 |
} catch (NoSuchFieldException e) { |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
64 |
FIELD_ClassLoader_Classes = null; |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
65 |
} catch (SecurityException e) { |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
66 |
FIELD_ClassLoader_Classes = null; |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
67 |
} |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
68 |
} |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
69 |
|
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
70 |
/** |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
71 |
* Returns a suitable {@link ReflectiveClassLoader} for given (real) {@link ClassLoader}. |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
72 |
* |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
73 |
* @param loader a {@link ClassLoader} on which to reflect. |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
74 |
* @return a {@link ReflectiveClassLoader} for given @param loader. |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
75 |
*/ |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
76 |
public static ReflectiveClassLoader forClassLoader(ClassLoader loader) { |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
77 |
if (loader == null) { |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
78 |
return PRIMORDIAL; |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
79 |
} |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
80 |
/* This is kind of ugly, we should provide a way to register custom subclasses, |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
81 |
* but for now, keep it simple. We'll see if this machinery proves usable at all. |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
82 |
*/ |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
83 |
if (loader instanceof java.net.URLClassLoader) { |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
84 |
return new ReflectiveURLClassLoader((java.net.URLClassLoader)loader); |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
85 |
} |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
86 |
return new ReflectiveClassLoader(loader); |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
87 |
} |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
88 |
|
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
89 |
public ReflectiveClassLoader getParent() { |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
90 |
if (realClassLoader == null) return null; |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
91 |
if (parent == null) { |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
92 |
parent = ReflectiveClassLoader.forClassLoader(realClassLoader.getParent()); |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
93 |
} |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
94 |
return parent; |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
95 |
} |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
96 |
|
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
97 |
/** |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
98 |
* Return <code>true</code> is package with name @param packageName exists under |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
99 |
* this class loader, <code>false</code> otherwise. |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
100 |
* |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
101 |
* A package is considered to exist if there's at least one class in that package. |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
102 |
* However, individual {@link ReflectiveClassLoader}s may extend the definition of |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
103 |
* {@link #isPackage(String)} For example {@link ReflectiveURLClassLoader} may return |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
104 |
* <code>true</code> if a directory exists along it's class path. |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
105 |
* |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
106 |
* @param packageName a name of the package |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
107 |
* @return <code>true</code> if such package exists, <code>false</code> otherwise |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
108 |
*/ |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
109 |
public boolean isPackage(String packageName) { |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
110 |
// First, check parent class loader |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
111 |
if (realClassLoader != null) { |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
112 |
if (realClassLoader.getParent() == null) { |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
113 |
if (PRIMORDIAL.isPackage(packageName)) { |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
114 |
return true; |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
115 |
} |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
116 |
} else { |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
117 |
if (getParent().isPackage(packageName)) { |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
118 |
return true; |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
119 |
} |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
120 |
} |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
121 |
} |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
122 |
// Second, consult list of already loaded classes. |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
123 |
if (realClassLoader != null && FIELD_ClassLoader_Classes != null) { |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
124 |
int packageNameLen = packageName.length(); |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
125 |
Vector<Class<?>> classes; |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
126 |
try { |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
127 |
classes = (Vector<Class<?>>)FIELD_ClassLoader_Classes.get(realClassLoader); |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
128 |
if (classes.size() > 0) { |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
129 |
Iterator<Class<?>> i = classes.iterator(); |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
130 |
while (i.hasNext()) { |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
131 |
String className = i.next().getName(); |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
132 |
int classNameLen = className.length(); |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
133 |
if ((classNameLen > packageNameLen) && |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
134 |
(className.charAt(packageNameLen) == '.') && |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
135 |
(className.startsWith(packageName))) { |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
136 |
return true; |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
137 |
} else if ((classNameLen == packageNameLen) && |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
138 |
className.equals(packageName)) { |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
139 |
return false; |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
140 |
} |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
141 |
} |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
142 |
} |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
143 |
} catch (IllegalArgumentException e) { |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
144 |
// If we're for whatever reason fobidden access to classes field, |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
145 |
// well, just ignore it. |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
146 |
} catch (IllegalAccessException e) { |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
147 |
// same as above. |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
148 |
} |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
149 |
} |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
150 |
// Last, we don't know. For generic ClassLoader, there's no other way |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
151 |
// to figure out what packages are there or not. So be conservative... |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
152 |
return false; |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
153 |
} |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
154 |
|
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
155 |
public ClassLoader getRealClassLoader() { |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
156 |
return realClassLoader; |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
157 |
} |
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
158 |
|
93a3efa06bd1
ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
159 |
} |