web-dev-qa-db-fra.com

Comment obtenir le nom actuel de la classe, y compris le nom du paquet, en Java?

Je travaille sur un projet et l'une des conditions est que si le deuxième argument de la méthode principale commence par "/" (Pour Linux), il doit le considérer comme un chemin absolu (pas un problème), mais s'il ne commence pas par “/”, il devrait obtenir le chemin de travail actuel de la classe et lui ajouter l'argument donné.

Je peux obtenir le nom de la classe de plusieurs manières: System.getProperty("Java.class.path"), new File(".") et getCanonicalPath(), etc.

Le problème est que cela ne me donne que le répertoire dans lequel les paquets sont stockés - c’est-à-dire que si une classe est stockée dans ".../project/this/is/package/name", Cela ne me donnera que "/project/" Et ignore le nom du paquet où réside le .class files réel.

Aucune suggestion?

EDIT: Voici l'explication, tirée de la description de l'exercice

sourcedir peut être absolu (commençant par "/") ou relatif à l'endroit où nous exécutons le programme depuis

sourcedir est un argument donné pour la méthode principale. Comment puis-je trouver ce chemin?

72
La bla bla

Utilisez this.getClass().getCanonicalName() pour obtenir le nom complet de la classe.

Notez qu'un nom de package/classe ("a.b.C") est différent du chemin des fichiers .class (a/b/C.class) et que l'utilisation du nom de package/nom de classe pour dériver un chemin est généralement une mauvaise pratique. Les ensembles de fichiers/packages de classe peuvent se trouver dans plusieurs chemins de classes différents, qui peuvent être des répertoires ou des fichiers JAR.

147
The Nail

Il y a une classe, Class , qui peut faire ceci:

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());

Si c représentait la classe MyClass dans le package mypackage, le code ci-dessus serait imprimé:

Paquet: mypackage
Classe: MyClass
Identifiant complet: mypackage.MyClass

Vous pouvez prendre ces informations et les modifier selon vos besoins, ou vous rendre à consultez l'API pour plus d'informations.

25
Jon Egeland

Le nom complet est défini comme suit:

String fqn = YourClass.class.getName();

Mais vous devez lire une ressource de classpath. Donc utiliser

InputStream in = YourClass.getResourceAsStream("resource.txt");
11
Bozho

utilisez this.getClass().getName() pour obtenir packageName.className et utilisez this.getClass().getSimpleName() pour obtenir uniquement le nom de la classe

3
Zahangir Alam