2015-05-22 2 views
5

Я пытаюсь запустить этот код:Загрузка массива с загрузчиком классов

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); 
    } 
} 

Но это бросает ClassNotFoundException. Интересно, если я вместо этого использую эту строку:

Class.forName(cname); 

это работает просто отлично.

Что здесь происходит?

редактировать: Я использую Java 6. println печатает это:

[Ljava.lang.Object; 
+2

Я думаю, вы спрашиваете из любопытства, потому что в java-массиве «классы» генерируются vm, поэтому нет смысла загружать их. (вы загрузите класс компонента, а затем создадите массив, который vm создаст класс массива) – morpheus05

+1

Возможный дубликат [Class.forName() vs ClassLoader.loadClass() - который используется для динамической загрузки?] (http://stackoverflow.com/questions/8100376/class-forname-vs-classloader-loadclass-which-to-use-for-dynamic-loading) –

+0

Тип массива действительно класс; и 'Class.forName()' javadoc позволяет это. – ZhongYu

ответ

3

Они не одинаковы у всех,

Class.forName возвращают объект класса , связанный с классом данное имя.

В вашем примере вы указываете loadClass a String, которые представляют собой имя класса, а не дают ему непосредственно класс.

Этот метод позволяет вам указывать имя, однако оно должно быть binary name класса, а не только имя класса.

Любое имя класса, предоставленное в качестве параметра String методам в ClassLoader, должно быть двоичным именем, определенным в Спецификации языка Java ™.

1

Во-первых, использование загрузчика классов для загрузки и загрузки массива java.lang.Object вряд ли сработает (поскольку java.lang.Object загружается загрузчиком классов по умолчанию). Далее, название, данное

Object[] obj = new Object[]{}; 
String cname = obj.getClass().getName(); 
System.out.println(cname); 

является [Ljava.lang.Object;. Очевидно, что это не класс, который может быть разрешен ClassLoader - javadoc говорит (частично) Погрузчик класса - это объект, который отвечает за загрузку классов; Заметьте, что он не говорит, что отвечает за загрузку массивов. В массивах отражений обрабатываются java.lang.reflect.Array, в которых, в частности, говорится: Класс Array предоставляет статические методы для динамического создания и доступа к массивам Java., который, кажется, является тем, что вы ищете.

1

Глядя на source code around the line that the exception is thrown on, похоже, что он пытается создать имя файла класса, как это:

String path = name.replace('.', '/').concat(".class"); 

Учитывая, что значение cname является [Ljava.lang.Object;, я не особо удивлен, что файл .class не может быть найден.

Смежные вопросы