L'idea di classpath è di nascondere da dove vengono le classi. Potresti avere classi con lo stesso nome caricate da diversi classloader, potresti avere la stessa classe in più jar e fare affidamento sull'ordinamento del classpath per scegliere quello corretto.
Perché vuoi sapere? Se è per qualsiasi altra ragione che non sia il debug/logging, sei su un terreno pericoloso e dovresti procedere con cautela.
In effetti è perfettamente ragionevole che le classi non abbiano file jar. Questo può accadere in Java per qualsiasi classe generata in runtime (si pensi ai proxy).
In clojure un semplice esempio sarebbe come mostrato nella sessione di sostituzione in basso ... Vedrete il suggerimento di @ mikera funziona bene per clojure.lang.Atom
che è un built-in classe. Ma quando si utilizza un deftype
per creare il proprio tipo, clojure genera una classe e non ha posizione ...
user> (prn (-> clojure.lang.Atom
(.getProtectionDomain)
(.getCodeSource)
(.getLocation)))
#<URL file:/workspace/clj-scratch/lib/clojure-1.3.0.jar>
nil
user> (deftype Foo [])
user.Foo
user> (prn (-> (Foo.)
(.getClass)
(.getProtectionDomain)
(.getCodeSource)
(.getLocation)))
nil
nil
user>
Se si desidera trovare questo percorso per individuare risorse (come immagini, ecc.), È possibile raggrupparle all'interno del JAR. Java ha un'API per accedere ai file di risorse che sono impacchettati all'interno di un JAR. –
@AlexD: risorse come le immagini non sono l'unico utilizzo possibile. Potrei dover eseguire programmi a riga di comando separati con i miei JAR/script, o potrei aver bisogno di registrare il mio programma nel sistema. Inoltre alcuni framework si basano sui percorsi reali nel filesystem, non sugli URI in JAR. – ffriend