108 votes

Comment obtenir le nom de classe actuel incluant le nom du package en Java?

Je travaille sur un projet et une exigence est que si le 2ème argument de la méthode principale commence par "/" (pour linux), il doit le considérer comme un chemin absolu (pas de problème), mais s'il ne commence pas par "/", il devrait obtenir le chemin de travail actuel de la classe et y ajouter l'argument donné.

Je peux obtenir le nom de la classe de plusieurs façons : System.getProperty("java.class.path"), new File(".") et getCanonicalPath(), et ainsi de suite...

Le problème est que cela ne me donne que le répertoire dans lequel les packages sont stockés - c'est-à-dire que si j'ai une classe stockée dans ".../projet/ceci/est/nom/dupackage", cela me donnerait seulement "/projet/" et ignore le nom du package où se trouvent les fichiers .class réels.

Des suggestions?

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

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

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

198voto

The Nail Points 3567

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

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

34voto

Jon Points 4637

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

Class c = Class.forName("MyClass"); // si vous voulez spécifier une classe
Class c = this.getClass();          // si vous voulez utiliser la classe actuelle

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 afficherait :

Package: mypackage
Class: MyClass
Full Identifier: mypackage.MyClass

Vous pouvez prendre ces informations et les modifier selon vos besoins, ou aller vérifier l'API pour plus d'informations.

16voto

Bozho Points 273663

Le nom entièrement qualifié est obtenu comme suit :

String fqn = YourClass.class.getName();

Mais vous avez besoin de lire une ressource du classpath. Utilisez donc

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

8voto

Zahangir Alam Points 1

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X