¿Cómo obtener el nombre de la clase actual, incluido el nombre del paquete en Java?

82

Estoy trabajando en un proyecto y un requisito es que si el segundo argumento del método principal comienza con " /" (para Linux), debería considerarlo como una ruta absoluta (no es un problema), pero si no comienza con " /”, Debe obtener la ruta de trabajo actual de la clase y agregarle el argumento dado.

Puedo conseguir el nombre de clase de varias maneras: System.getProperty("java.class.path"), new File(".")y getCanonicalPath(), y así sucesivamente ...

El problema es que esto solo me da el directorio en el que se almacenan los paquetes, es decir, si tengo una clase almacenada en " .../project/this/is/package/name", solo me daría " /project/" e ignora el nombre del paquete donde .class filesvive el actual .

¿Alguna sugerencia?

EDITAR: Aquí está la explicación, tomada de la descripción del ejercicio

sourcedir puede ser absoluto (comenzando con "/") o relativo al lugar desde donde ejecutamos el programa

sourcedir es un argumento dado para el método principal. ¿cómo puedo encontrar ese camino?

La bla bla
fuente
2
¿Qué hará si el código está empaquetado en un JAR (o no está en una estructura de carpeta / archivo como está asumiendo)? Es una suposición peligrosa; esto podría funcionar bien para un pequeño experimento, asignación de clase u otra situación desechable, pero POR FAVOR no se acostumbre a hacer esa suposición para el código de calidad de producción.
E-Riz
No tiene sentido encontrar la ruta al archivo de clase. Además, la descripción del ejercicio no menciona que si lo lee con atención (desde donde ejecutamos el programa significa la ruta actual desde la que el usuario llama al programa).
The Nail
¿Quizás podrías ayudarme a comprender mejor el requisito? Necesito verificar que el argumento comience con una '/' (mencionar en la descripción). si es así, utilícelo como absoluto. como es. pero si no es así, ¿cómo debo tratarlo?
La bla bla

Respuestas:

166

Úselo this.getClass().getCanonicalName()para obtener el nombre completo de la clase.

Tenga en cuenta que un nombre de paquete / clase ("abC") es diferente de la ruta de los archivos .class (a / b / C.class), y que usar el nombre de paquete / clase para derivar una ruta suele ser una mala práctica. Los conjuntos de archivos / paquetes de clases pueden estar en varias rutas de clases diferentes, que pueden ser directorios o archivos jar.

La uña
fuente
gracias, pero está en el método principal, y 'esto' no se puede usar en métodos estáticos. ¿Alguna solución?
La bla bla
30

Hay una clase Class, que puede hacer esto:

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 crepresenta la clase MyClassen el paquete mypackage, el código anterior se imprimiría:

Paquete: mypackage
Clase: MyClass
Identificador completo: mypackage.MyClass

Puede tomar esta información y modificarla para lo que necesite, o consulte la API para obtener más información.

Jon Egeland
fuente
1
Tenga en cuenta que Class.forName ("MyClass") solo funcionará si está en el paquete predeterminado (es decir, no tiene declaración de paquete).
The Nail
2
@TheNail es verdadero y getName()devuelve el nombre del paquete junto con el nombre de la clase, editando ahora.
Jon Egeland
Úselo getSimpleName()para obtener solo el nombre de la clase sin el nombre del paquete.
The Nail
1
En lugar de Class.forName("MyClass")debería usarlo a MyClass.classmenos que realmente necesite el descubrimiento en tiempo de ejecución por alguna otra razón.
mjaggard
12

El nombre completo se obtiene de la siguiente manera:

String fqn = YourClass.class.getName();

Pero necesitas leer un recurso classpath. Así que usa

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

usar this.getClass().getName()para obtener packageName.classNamey usar this.getClass().getSimpleName()para obtener solo el nombre de la clase

Md. Zahangir Alam
fuente