Bug 56550: Defer the initialization of the _classes to when it is actually needed to allow IBM JDK to at least load the class

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1647302 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Dominik Stadler 2014-12-22 12:38:44 +00:00
parent a7ba500280
commit 645d2083bf

View File

@ -47,16 +47,7 @@ import org.junit.runner.Result;
* @author Yegor Kozlov * @author Yegor Kozlov
*/ */
public final class OOXMLLite { public final class OOXMLLite {
private static Field _classes;
private static final Field _classes;
static {
try {
_classes = ClassLoader.class.getDeclaredField("classes");
_classes.setAccessible(true);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/** /**
* Destination directory to copy filtered classes * Destination directory to copy filtered classes
@ -206,6 +197,16 @@ public final class OOXMLLite {
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private static Map<String, Class<?>> getLoadedClasses(String ptrn) { private static Map<String, Class<?>> getLoadedClasses(String ptrn) {
// make the field accessible, we defer this from static initialization to here to
// allow JDKs which do not have this field (e.g. IBM JDK) to at least load the class
// without failing, see https://issues.apache.org/bugzilla/show_bug.cgi?id=56550
try {
_classes = ClassLoader.class.getDeclaredField("classes");
_classes.setAccessible(true);
} catch (Exception e) {
throw new RuntimeException(e);
}
ClassLoader appLoader = ClassLoader.getSystemClassLoader(); ClassLoader appLoader = ClassLoader.getSystemClassLoader();
try { try {
Vector<Class<?>> classes = (Vector<Class<?>>) _classes.get(appLoader); Vector<Class<?>> classes = (Vector<Class<?>>) _classes.get(appLoader);