Domanda

Qualcuno mi può indicare una buona risorsa o me spiegare circa il concetto dietro Classe Pale? Ho trovato il seguente risorsa su caricatori di classe http://www.onjava.com/lpt/a/5586 ma ancora nessun aiuto. Le seguenti domande possono sembrare sciocco, ma cercando di rispondere sempre mi confonde.

  • Perché gli sviluppatori a scrivere caricatori di classi personalizzate, perché non invocare una classe di bootstrap loader per richiamare le vostre classi personalizzate? Qual è la necessità di definire caricatori di classe personalizzati?
  • Perché ci sono così tante varietà di caricatori di classe? ad esempio:. Bootsrap, Comman, Catalina class loader etc,

    Grazie in anticipo.

È stato utile?

Soluzione

Ho trovato i seguenti, validi motivi per creare classloader personalizzati:

  1. Si desidera caricare una classe da una fonte non convenzionale (ad esempio, il bytecode per una classe è memorizzato in un database, attraverso la rete o trasportato come 0 e 1 da piccioni - MessengerPidgeonClassLoader). C'è già alcune implementazioni ClassLoader nel API per tali casi, come URLClassLoader .

  2. È necessario definire una gerarchia diversa per caricare classi. implementazione di default del delegato ClassLoader la ricerca prima al genitore, poi cercano di caricare la classe stessi. Forse si vuole una gerarchia diversa. Questo è il motivo per cui OSGi ed Eclipse dispone di un proprio ClassLoader dei file manifesto .MF definiscono tutti i tipi di percorsi di gerarchia strani (buddy-classloading, per esempio). Tutti i classloader Eclipse implementare l'interfaccia BundleClassLoader e avere un po 'di codice in più per trovare le risorse all'interno di Eclipse Plugin.

  3. Hai bisogno di fare qualche modifica al bytecode. Forse il bytecode è crittografato, e si unencrypt al volo ( Non che aiuta, in realtà, ma è stato provato ). Forse si vuole "patch" le classi caricati al volo (ALLA JDO bytecode valorizzazione).

Utilizzando un programma di caricamento classe diversa rispetto al programma di caricamento classi Sistema è necessario se si ha bisogno di scaricare le classi dalla memoria, o per caricare le classi che potrebbe cambiare la loro definizione in fase di esecuzione. Un caso tipico è un'applicazione che genera una classe al volo da un file XML, ad esempio, e poi cerca di ricaricare questa classe. Una volta che una classe è nel sistema di caricamento classi, non c'è modo per scaricare e avere una nuova definizione.

Altri suggerimenti

Un uso comune di classloader è quello di isolare un JAR. Se si dispone di un'applicazione che utilizza i plugin ( Eclipse , Maven 2 ), allora si può avere questa situazione: Plugin X ha bisogno di vaso A con la versione 1.0, mentre plug-Y ha bisogno lo stesso vaso, ma la versione 2.0. X non funziona con la versione 2.0, però.

Se avete classloader, è possibile creare partizioni di classi (si pensi isole isolate collegate da ponti sottili, i ponti sono i classloader). In questo modo, i classloader possono controllare ciò che ogni plugin può vedere.

Quando plug X istanzia una classe Foo, che ha campi statici, questo non è un problema e non ci sarà un disguido con la "stessa" classe plug Y perché ogni classloader sarà infatti creare una propria istanza della classe foo. Devi quindi due classi in memoria, in cui è cl1.getName().equals(cl2.getName()) true ma cl1.equals(cl2) non lo è. Ciò significa che i casi di CL1 non sono compatibili assegnazione alle istanze di Cl2. Questo può portare a strani ClassCastExceptions che dicono che org.project.Foo non può essere assegnato a org.project.Foo.

Proprio come con isole remote, le due classi non sono consapevoli del fatto che l'altro esiste. Pensate di cloni umani che nascono e poi cresciuti in isole diverse. Dal punto di vista della macchina virtuale, non c'è nessun problema, perché le istanze del tipo di classe vengono gestiti come qualsiasi altro oggetto: Ci possono essere molti di loro. Ciò si pensa che alcuni di loro sono "lo stesso" non importa alla VM.

Un altro uso di questo modello è che si può sbarazzarsi di classi caricate in questo modo: Basta fare in modo che nessuno ha un puntatore a qualsiasi oggetto creato da classi caricate da un programma di caricamento classe e poi dimenticare il programma di caricamento classe, anche. Nella successiva esecuzione del GC , tutte le classi caricate da questo classloader vengono rimossi dalla memoria . Questo ti permette di "ricaricare" la vostra applicazione senza dover riavviare l'intera VM.

Un paio di blog che ho scritto in passato profondo sull'utilizzo classloader post-delega:

Non si può andare oltre la fonte prima, in casi come questo. Se davvero vuole la droga all'interno, hard core , leggere i bit rilevanti della Java Virtual Machine Specification .

Un altro buon collegamento per caricatori di classi Java - classloader Java

E 'estremamente raro che è necessario creare il proprio ClassLoader. E genereally se è necessario, si dovrebbe già avere una buona comprensione di ciò che il ClassLoader fa.

In altre parole, se stai chiedendo il motivo per cui si avrebbe bisogno di creare il proprio ClassLoader, allora non è necessario crearne uno;)

Detto questo, ho anche visto un ClassLoader in fase di creazione per un'applicazione che si occupava di crittografia. In questo modo ogni volta che si crea un java.netSocket o qualche tipo di oggetto file / flusso, invece di utilizzare le versioni di JVM sarebbe utilizzare le proprie classi incorporate speciali personalizzate. In questo modo si potrebbe garantire la che tutte le informazioni è stato criptato e che non ci sono errori di sviluppo.

Ma non è molto comune. Si può andare tutta una carriera Java senza la necessità di creare il proprio ClassLoader personalizzato. In realtà se è necessario creare uno, si dovrebbe davvero chiedere se è necessario.

  

Perché gli sviluppatori a scrivere caricatori di classi personalizzate, perché non invocare una classe bootstrap loader per richiamare le vostre classi personalizzate? Qual è la necessità di definire caricatori di classe personalizzati?

A seconda dell'applicazione, gli sviluppatori potrebbero escludere o sostituire completamente il meccanismo di caricamento delle classi in base alle loro esigenze.

Per esempio, ho usato uno applicazione cui classi vengono caricati da un LDAP: S

Altre applicazioni hanno bisogno di gestione di classe indipendente (come la maggior parte dei server applicativi che supportano hot-deploy)

A proposito di risorse, ci sono tonnellate, nel web, che semplicemente non può essere elencato.

Un esempio:

Tomcat usa WebAppClassloader personalizzata per caricare e isolare le classi / barattoli da diverse applicazioni web.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top