2012-03-15 30 views
56

Sto lavorando a un progetto e un requisito è se il secondo argomento per il metodo main inizia con '/' (per linux) dovrebbe considerarlo come un percorso assoluto (non un problema) , ma se non inizia con '/', dovrebbe ottenere il percorso di lavoro corrente della classe e aggiungervi l'argomento dato.Ottenere il nome della classe corrente incluso il pacchetto

posso ottenere il nome della classe in diversi modi: System.getProperty("java.class.path"), new File(".") e getCanonicalPath(), e così via ..

Il problema è, questo mi dà solo la directory in cui sono archiviati i pacchetti - vale a dire se ho una classe memorizzata in ".../project/this/is/package/name", mi darebbe solo "/ project /" e ignora il nome del pacchetto in cui si trovano i file .class effettivi.

Qualche suggerimento?

EDIT: Ecco la spiegazione, preso dalla descrizione esercizio

sourcedir può essere sia assoluta (che inizia con “/”) o relativa al punto in cui si corre il programma dal

SourceDir è un argomento dato per il metodo principale. come posso trovare quel percorso?

+2

Cosa farai se il codice è impacchettato in un JAR (o altrimenti non è in una cartella/struttura di file come stai assumendo)? È un presupposto pericoloso; questo potrebbe funzionare bene per un piccolo esperimento, assegnazione di classe o altra situazione usa e getta, ma PER FAVORE non prendere l'abitudine di fare questo presupposto per il codice di qualità di produzione. –

+0

Non ha senso trovare il percorso del file di classe.Anche la descrizione dell'esercizio non menziona che se la leggi attentamente (* dove eseguiamo il programma da * indica il percorso corrente dal quale il programma viene chiamato dall'utente). –

+0

Forse potresti aiutarmi a capire meglio il requisito? Ho bisogno di controllare l'argomento inizia con un '/' (menzione nella descrizione). se lo fa, basta usarlo come assoluto. come è. ma se non lo fa, come dovrei trattarlo? –

risposta

112

Utilizzare this.getClass().getCanonicalName() per ottenere il nome completo della classe.

Si noti che un nome pacchetto/classe ("abC") è diverso dal percorso dei file .class (a/b/C.class) e che l'utilizzo del nome pacchetto/nome classe per derivare un percorso è tipicamente cattiva pratica. Gli insiemi di file/pacchetti di classe possono trovarsi in più percorsi di classe diversi, che possono essere directory o file jar.

+0

grazie, ma è nel metodo principale e 'questo' non può essere utilizzato in metodi statici. qualsiasi lavoro intorno ad esso? –

+0

http://stackoverflow.com/questions/936684/getting-the-class-name-from-a-static-method-in-java –

+0

ha modificato la domanda. per meglio spiegare –

16

C'è una classe, Class, che può fare questo:

Class c = Class.forName("MyClass"); // if you want to specify a class 
Class c = this.getClass();   // if you want to use the current class 

System.out.println("Package: "+c.getPackage()+"\nClass: "+c.getSimpleName()+"\nFull Identifier: "+c.getName()); 

Se c rappresentato la classe MyClass nel pacchetto mypackage, il codice di cui sopra sarebbe stampare:

pacchetto: mypackage
Classe: MyClass
Identificatore completo: mypackage.MyClass

È possibile prendere queste informazioni e modificarle per qualsiasi necessità oppure andare a check the API per ulteriori informazioni.

+0

Nota che Class.forome ("MyClass") funzionerà solo se è nel pacchetto predefinito (cioè non ha alcuna dichiarazione di pacchetto). –

+1

@TheNail true e 'getName()' restituisce il nome del pacchetto insieme al nome della classe, modificando ora. – Jon

+0

Usa 'getSimpleName()' per ottenere solo il nome della classe senza nome del pacchetto. –

6

Il nome completo è opbtained come segue:

String fqn = YourClass.class.getName(); 

Ma è necessario leggere una risorsa percorso di classe. Quindi usa

InputStream in = YourClass.getResourceAsStream("resource.txt"); 
Problemi correlati