2009-04-22 18 views
20

Penso che questa sia una situazione in cui ogni programmatore Java si imbatte se lo fa abbastanza a lungo. Stai facendo un po 'di debug e apporti una modifica alla classe. Quando si va a rieseguire il programma, queste modifiche non sembrano essere state rilevate, ma la vecchia classe sembra ancora in esecuzione. Pulisci e ricostruisci tutto, lo stesso problema. A volte, questo può arrivare a un problema di classpath, la stessa classe si trova sul classpath più di una volta, ma non sembra essere un modo semplice per capire da dove proviene la classe che viene ...In che punto del file system è stata caricata la mia classe Java?

C'è un modo per trovare il percorso del file per la classe che è stata caricata? Preferibile qualcosa che potrebbe funzionare se la classe è stata caricata da un file .class o da un file .jar. Qualche idea?

+0

Questo è quasi la stessa della seguente domanda, che ha risposte leggermente diverse: http://stackoverflow.com/questions/947182/how-to-explore-which-classes-are-loaded-from-which-jars –

risposta

26

È sufficiente eseguire java utilizzando l'interruttore della riga di comando standard "-verbose:class" (vedere the java documentation). Questo verrà stampato ogni volta che una classe viene caricata e ti dirà da dove viene caricata.

+0

In realtà, qualsiasi JVM, poiché -verbose è un flag richiesto, non è vero? Sono i flag -X dipendenti dal fornitore. –

+0

Grazie, l'ho detto. –

13

Se si voleva fare a livello di codice da dentro l'applicazione, provare:

URL loc = MyClass.class.getProtectionDomain().getCodeSource().getLocation(); 

(nota, getCodeSource() può restituire null, in modo da realtà non fare tutto questo in una sola riga :))

+0

getProtectionDomain potrebbe restituire anche null (in genere per le classi di avvio). La mia domanda è, se le modifiche non vengono visualizzate, come si esegue questo codice? :) –

0

Dato che la classe deve provenire da qualche parte nel percorso della classe, mi raccomando semplicemente a print the class path e controlla se c'è una versione precedente della tua classe da qualche parte.

+3

In realtà, non è più vero. Ci sono le classi di sistema, le directory di estensione (sì, plurale), i caricatori di classi estendibili dinamicamente (ala URLClassLoader). In questi giorni, da cui la classe proviene, è forse piuttosto complicato. –

+0

-1 perché inaccurato (vedere il commento di Software Monkey) –

+0

Come si può stampare il percorso della classe? Il link fornito è rotto. – Dezza

5
public static URL getClassURL(Class klass) { 
    String name = klass.getName(); 
    name = "/" + convertClassToPath(name); 
    URL url = klass.getResource(name); 
    return url; 
} 

public static String convertClassToPath(String className) { 
    String path = className.replaceAll("\\.", "/") + ".class"; 
    return path; 
} 

Basta incollarlo da qualche parte e passarlo l'oggetto Class per la classe in cui si desidera trovare la definizione. Dovrebbe funzionare indipendentemente da dove ha chiamato, dal momento che chiama getResource() sulla classe cercata.

public static void main(String[] args) { 
    System.out.println(getClassURL(String.class));  
} 

Esempio di output: jar: file:! /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Classes/classes.jar /java/lang/String.class

Problemi correlati