2015-05-22 5 views
5

Sto cercando di eseguire questo codice:Caricamento di un array con un classloader

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

Ma getta un ClassNotFoundException. È interessante notare che se invece utilizzo questa riga:

Class.forName(cname); 

funziona perfettamente.

Che cosa sta succedendo qui?

edit: sto usando Java 6. Le println stampe questo:

[Ljava.lang.Object; 
+2

Credo che si chiede per curiosità, perché in Java matrice "classi" sono generati dalla vm quindi non ha senso per caricarli. (Il vostro potrebbe caricare la classe del componente e quindi creare una matrice di una VM creerebbe la classe Array) – morpheus05

+1

possibile duplicato del [Class.forName() vs ClassLoader.loadClass() - che da utilizzare per il caricamento dinamico?] (Http://stackoverflow.com/questions/8100376/class-forname-vs-classloader-loadclass-which-to-use-for-dynamic-loading) –

+0

un tipo di array è effettivamente una classe; e 'Class.forName()' javadoc lo consente. – ZhongYu

risposta

3

Essi non sono la stessa cosa a tutti,

Class.forName ritorno l'oggetto Classe associato alla classe di il nome dato

Nell'esempio, si fornisce a loadClass un String che rappresenta il nome di una classe, invece di assegnarlo direttamente a una classe.

Questo metodo consente di dare un nome, tuttavia deve essere il binary name della classe, non solo il nome della classe.

Qualsiasi nome della classe fornita come parametro String ai metodi di ClassLoader deve essere un nome binario come definito da The Java ™ Language Specification.

1

Prima di tutto, utilizzare un caricatore di classe per provare a caricare l'array java.lang.Object è improbabile che funzioni (dal momento che java.lang.Object viene caricato dal caricatore di classe predefinito). Successivamente, il nome dato da

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

è [Ljava.lang.Object;. Chiaramente che non è una classe che può essere risolto da una ClassLoader - Javadoc dice (in parte) Un caricatore di classe è un oggetto che è responsabile per le classi di carico; nota che non dice che è responsabile del caricamento degli array. Nella riflessione array sono trattati con java.lang.reflect.Array che dice, in parte, La classe Array fornisce metodi statici per creare in modo dinamico e array accesso Java. che sembra essere quello che stai cercando.

1

Guardando il source code around the line that the exception is thrown on, sembra che sta cercando di costruire il nome del file della classe in questo modo:

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

dato che il valore di cname è [Ljava.lang.Object;, io non sono particolarmente sorpreso dal fatto che il file .class non può essere trovato