Come posso fare questo:lanciato attraverso il classloader?
class Foo {
public static Foo get() throws Exception {
ClassLoader cl = new URLClassLoader(new URL[]{"foo.jar"}, null); // Foo.class is in foo.jar
return (Foo)cl.loadClass("Foo").newInstance(); // fails on class cast
}
}
cosa ho bisogno è per la JVM di prendere in considerazione l'istanza Foo da cl come se fosse un 'istanza di Foo dal classloader del codice in esecuzione.
ho visto questi approcci, nessuno di loro bene per me (l'esempio di cui sopra è un esempio di giocattolo):
- caricare la classe (o un'interfaccia separata) da un caricatore di classe che è un genitore di sia il codice chiamante e classloader creato
- serializzare e deserializzare l'oggetto.
Quindi, se non possiamo nemmeno lanciare queste nuove istanze, come possiamo utilizzarle? Se tutto ciò che possiamo fare è 'Object obj = cl.loadClass (" Foo "). NewInstance();', come chiamiamo i metodi della nuova istanza di Foo? – Pacerier
@Pacerier: bene, è possibile utilizzare la riflessione. Ma un caso più pratico è quello di fare in modo che le classi estendano le classi o implementino le interfacce da un classloader padre nella gerarchia di delega che sono disponibili anche per il resto del codice. Ma nel codice di esempio, non v'è alcun programma di caricamento classe genitore (secondo parametro al costruttore è nullo) ... –
Può la performance della seconda opzione più veloce rispetto all'utilizzo di riflessione? O è vero che utilizza internamente la riflessione comunque? – Pacerier