in transform/src/patch/java/org/apache/openjpa/lib/util/TemporaryClassLoader.java [47:98]
protected Class loadClass(String name, boolean resolve)
throws ClassNotFoundException {
// see if we've already loaded it
Class c = findLoadedClass(name);
if (c != null)
return c;
// bug #283. defer to system if the name is a protected name.
// "sun." is required for JDK 1.4, which has an access check for
// sun.reflect.GeneratedSerializationConstructorAccessor1
if (name.startsWith("java.") || name.startsWith("javax.") || name.startsWith("jakarta.")
|| name.startsWith("sun.") || name.startsWith("jdk.")) {
return Class.forName(name, resolve, getClass().getClassLoader());
}
String resourceName = name.replace('.', '/') + ".class";
InputStream resource = getResourceAsStream(resourceName);
if (resource == null) {
throw new ClassNotFoundException(name);
}
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte[] b = new byte[1024];
try {
for (int n = 0; (n = resource.read(b, 0, b.length)) != -1;
bout.write(b, 0, n))
;
byte[] classBytes = bout.toByteArray();
// To avoid classloader issues with the JVM (Sun and IBM), we
// will not load Enums via the TemporaryClassLoader either.
// Reference JIRA Issue OPENJPA-646 for more information.
if (isAnnotation(classBytes) || isEnum(classBytes)) {
try {
Class<?> frameworkClass = Class.forName(name, resolve,
getClass().getClassLoader());
return frameworkClass;
} catch (ClassNotFoundException e) {
// OPENJPA-1121 continue, as it must be a user-defined class
}
}
try {
return defineClass(name, classBytes, 0, classBytes.length);
} catch (SecurityException e) {
// possible prohibited package: defer to the parent
return super.loadClass(name, resolve);
}
} catch (IOException ioe) {
// defer to the parent
return super.loadClass(name, resolve);
}
}