Le questioni sono svariate per fare una cosa del genere.Originariamente inviato da enfix86
La gestione che volevo fare è proprio come dici tu, una sorta di plugin che viene aggiunto.
Dopo infatti mi servirebbe anche recuperare la classe che implementa un certo tipo di interfaccia.
Come posso fare entrambe le cose ?
Innanzitutto la applicazione deve sapere di dover scansionare una (o più) directory "note" al fine di rintracciare i plugin. Basterebbe stabilire ad esempio che un plugin è un file che si può chiamare come si vuole purché con estensione .jar che sia "depositato" in quella/e directory.
Per gestire il caricamento si deve usare un apposito "class loader" e in genere si può usare java.net.URLClassLoader. Ma il problema non è tanto questo.
La vera questione è: cosa andare a cercare a livello di classi?
Forzare e imporre a tutti i plugin di avere una certa classe con un nome ben preciso sarebbe possibile (a patto di usare class loader distinti). Ma sarebbe comunque poco bello e poco pratico.
La cosa migliore sarebbe quella di avere nel pacchetto del plugin un qualcosa che fornisce delle "meta informazioni" sul plugin. Tra cui che so ... nome del plugin, autore, ecc... compresa la indicazioni di quale/i classe/i caricare.
Tutto questo potrebbe essere descritto in vari modi: con un file XML, con un file di properties o magari messo tra gli attributi del "manifest" del jar.
Se la applicazione si chiama japp si potrebbe ad esempio stabilire che nel jar del plugin alla "radice" ci deve essere un japp-plugin.xml che è il descrittore del plugin.
Si può fare come si vuole, non ci sono vincoli particolari né standard veri e propri. La applicazione una volta che ha composto il pathname al jar del plugin potrebbe aprirlo (un jar è uno zip) con le classi del package standard java.util.zip o java.util.jar e andare a cercare il "descrittore" (qualunque cosa sia).
Una volta che la applicazione ha determinato un nome di classe da caricare, tramite URLClassLoader e ancora con forName() di Class potrebbe ottenere finalmente il Class della classe (e istanziarla).
Tale classe dovrebbe implementare una interfaccia, che rappresenta il "ponte" o meglio dire il "contratto" tra la applicazione e i plugin. Tramite tale interfaccia il plugin potrebbe ricevere oggetti e/o "esporre" lui oggetti per fornire alla applicazione le funzionalità in più che implementa.
Anche questo è comunque tutto da stabilire in base alla applicazione e a cosa i plugin possono/devono fare. Non ci sono standard in questo senso.

Rispondi quotando