Bug 284520 Class org.osgi.framework.Bundle.loadClass(String name) throws ClassNotFoundException for Array Types
diff --git a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/ArrayTest.java b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/ArrayTest.java
new file mode 100644
index 0000000..e4ce55f
--- /dev/null
+++ b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/ArrayTest.java
@@ -0,0 +1,15 @@
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osgi.tests.bundles;
+
+public class ArrayTest {
+
+}
diff --git a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/ClassLoadingBundleTests.java b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/ClassLoadingBundleTests.java
index afbb7b2..acedfe4 100644
--- a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/ClassLoadingBundleTests.java
+++ b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/ClassLoadingBundleTests.java
@@ -1346,6 +1346,30 @@
}
}
+ public void testArrayTypeLoad() {
+ doTestArrayTypeLoad("[B"); //$NON-NLS-1$
+ doTestArrayTypeLoad("[C"); //$NON-NLS-1$
+ doTestArrayTypeLoad("[D"); //$NON-NLS-1$
+ doTestArrayTypeLoad("[F"); //$NON-NLS-1$
+ doTestArrayTypeLoad("[I"); //$NON-NLS-1$
+ doTestArrayTypeLoad("[J"); //$NON-NLS-1$
+ doTestArrayTypeLoad("[S"); //$NON-NLS-1$
+ doTestArrayTypeLoad("[Z"); //$NON-NLS-1$
+ doTestArrayTypeLoad("[Lorg.eclipse.osgi.tests.bundles.ArrayTest;"); //$NON-NLS-1$
+ doTestArrayTypeLoad("[[D"); //$NON-NLS-1$
+ doTestArrayTypeLoad("[[Lorg.eclipse.osgi.tests.bundles.ArrayTest;"); //$NON-NLS-1$
+ }
+
+ private void doTestArrayTypeLoad(String name) {
+ try {
+ Class arrayType = OSGiTestsActivator.getContext().getBundle().loadClass(name);
+ assertNotNull("Null class", arrayType); //$NON-NLS-1$
+ assertTrue("Class is not an array: " + arrayType, arrayType.isArray()); //$NON-NLS-1$
+ } catch (ClassNotFoundException e) {
+ fail("Unexpected exception", e); //$NON-NLS-1$
+ }
+ }
+
private String readURL(URL url) {
StringBuffer sb = new StringBuffer();
try {
diff --git a/bundles/org.eclipse.osgi/core/framework/org/eclipse/osgi/internal/loader/BundleLoader.java b/bundles/org.eclipse.osgi/core/framework/org/eclipse/osgi/internal/loader/BundleLoader.java
index c1f63f4..ae867f2 100644
--- a/bundles/org.eclipse.osgi/core/framework/org/eclipse/osgi/internal/loader/BundleLoader.java
+++ b/bundles/org.eclipse.osgi/core/framework/org/eclipse/osgi/internal/loader/BundleLoader.java
@@ -318,7 +318,12 @@
* @exception java.lang.ClassNotFoundException if the class definition was not found.
*/
final public Class loadClass(String name) throws ClassNotFoundException {
- return createClassLoader().loadClass(name);
+ BundleClassLoader bcl = createClassLoader();
+ // The instanceof check here is just to be safe. The javadoc contract stated in BundleClassLoader
+ // mandate that BundleClassLoaders be an instance of ClassLoader.
+ if (name.length() > 0 && name.charAt(0) == '[' && bcl instanceof ClassLoader)
+ return Class.forName(name, false, (ClassLoader) bcl);
+ return bcl.loadClass(name);
}
/**