I'm trying to run this code:
public class ClassLoaderTest
{
public static void main(String[] args) throws Exception
{
Object[] obj = new Object[]{};
String cname = obj.getClass().getName();
System.out.println(cname);
ClassLoaderTest.class.getClassLoader().loadClass(cname);
}
}
But it throws a ClassNotFoundException. Interestingly, if I instead use this line:
Class.forName(cname);
it works just fine.
Whats going on here?
edit:
I'm using Java 6. The println
prints this:
[Ljava.lang.Object;
They are not the same at all,
Class.forName
return the Class object associated with the class of the given name.
In your example, you give to loadClass
a String
that represent the name of a class, instead of giving it directly a class.
This method does allow you to give a name, however it must be the binary name
of the class, not just the class name.
Any class name provided as a String parameter to methods in ClassLoader must be a binary name as defined by The Java™ Language Specification.
First, using a class loader to try and load java.lang.Object
array is unlikely to work (since java.lang.Object
is loaded by the default class loader). Next, the name given by
Object[] obj = new Object[]{};
String cname = obj.getClass().getName();
System.out.println(cname);
is [Ljava.lang.Object;
. Clearly that isn't a class that can be resolved by a ClassLoader
- the javadoc says (in part) A class loader is an object that is responsible for loading classes; note it does not say it's responsible for loading arrays. In reflection arrays are handled with java.lang.reflect.Array
which says, in part, The Array
class provides static methods to dynamically create and access Java arrays. which seems to be what you're looking for.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With