Sto provando a giocare con la riflessione per vedere se riesco ad arrivare a un punto in cui sono in grado di digitare un nome di classe e la mia applicazione caricherà quella classe e ne creerà un'istanza. Dopo alcuni tentativi ho scoperto che non potevo semplicemente inserire un nome di classe in Class.forName()
senza il nome del pacchetto, quindi ho finito col cercare di ottenere un elenco di tutti i pacchetti disponibili che sono stati caricati e cercando di caricare la classe I con ogni nome del pacchetto fino a quando non ottiene un successo.Perché il mio riflesso carica strane lezioni?
Questo è quello che ho finora:
BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
String s = "";
do
{
ClassLoader clsldr = ClassLoader.getSystemClassLoader();
Package[] pkgs = Package.getPackages();
s = console.readLine();
if(s.equals(":exit"))
{
System.exit(0);
}
boolean classFound = false;
Object loadedClass = null;
String classname = "";
for (int i = 0; i < pkgs.length; i++) {
Package package1 = pkgs[i];
try
{
classname = package1.getName().replace('/', '.') + "." + s;
clsldr.loadClass(classname);
loadedClass = Class.forName(classname);
classFound = true;
}
catch(Exception e)
{
}
}
System.out.println("LOADED A CLASS!!!!");
System.out.println(classname);
System.out.println(loadedClass);
}
while(s.length() == 0);
Funziona semi in un modo molto strano. Ad esempio, quando digito "Oggetto" al prompt, in qualche modo riesce a caricare sun.net.util.Object
, ma quando stampo l'oggetto reale viene stampato class java.lang.Object
. Ottengo la stessa cosa con un String
e molte altre cose che ho digitato. Una cosa interessante che ho provato è stata int
- ha caricato sun.net.util.int
e quando ho stampato l'oggetto ha appena restituito null. Un altro successo quando ho provato Java
:
Java
LOADED A CLASS!!!!
sun.net.util.Java
null
Qualcuno ha qualche idea di cosa sta succedendo qui? C'è qualcosa di speciale nel pacchetto sun.net.util
che sta causando questo? Non mi interessa davvero che il mio codice non funzioni esattamente come voglio, mi piacerebbe solo sapere cosa sta causando questo strano comportamento.
versione Java:
java version "1.7.0_25"
Java(TM) SE Runtime Environment (build 1.7.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)
Sono su Windows 8 a 64 bit se che fa alcuna differenza.
Tranne che lo schema fallirà se la classe "strana" è quella che appare per prima. O se nessuna delle due classi è "strana"; per esempio. 'java.util.Date' versus' java.sql.Date'. –