diff options
author | Thomas Watson | 2009-07-24 20:00:00 +0000 |
---|---|---|
committer | Thomas Watson | 2009-07-24 20:00:00 +0000 |
commit | 62fdecb5e713adbda534c57bb4ff134b4ec2b4da (patch) | |
tree | 8cc121600f636081a121bc0a0c4292007d2aca9a | |
parent | 6c6dc201aa33b115be540848acc90021a63b8567 (diff) | |
download | rt.equinox.framework-62fdecb5e713adbda534c57bb4ff134b4ec2b4da.tar.gz rt.equinox.framework-62fdecb5e713adbda534c57bb4ff134b4ec2b4da.tar.xz rt.equinox.framework-62fdecb5e713adbda534c57bb4ff134b4ec2b4da.zip |
Bug 284520 Class org.osgi.framework.Bundle.loadClass(String name) throws ClassNotFoundException for Array TypesR35x_v20090724
3 files changed, 45 insertions, 1 deletions
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 000000000..e4ce55f12 --- /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 afbb7b2df..acedfe46e 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 class ClassLoadingBundleTests extends AbstractBundleTests { } } + 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 c1f63f472..ae867f25f 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 @@ public class BundleLoader implements ClassLoaderDelegate { * @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); } /** |