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

4 minutos de lectura

avatar de usuario
La bla bla

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

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

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 se encuentra el .class files vive.

¿Alguna sugerencia?

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

sourcedir puede ser absoluto (comenzando con “/”) o relativo a donde ejecutamos el programa desde

sourcedir es un argumento dado para el método principal. como puedo encontrar ese camino

  • ¿Qué hará si el código está empaquetado en un JAR (o no está en una estructura de carpetas/archivos como está asumiendo)? Es una suposición peligrosa; esto podría funcionar bien para un pequeño experimento, tarea 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

    15/03/2012 a las 22:56

  • No tiene sentido encontrar la ruta al archivo de clase. Además, la descripción del ejercicio no menciona que si lo lee detenidamente (desde donde ejecutamos el programa significa la ruta actual desde la cual el usuario llama al programa).

    – La uña

    15/03/2012 a las 23:15

  • ¿Quizás podría ayudarme a comprender mejor el requisito? Necesito verificar que el argumento comience con ‘/’ (mención en la descripción). si es así, simplemente utilícelo como absoluto. como es. pero si no es así, ¿cómo debo tratarlo?

    – La bla bla

    15 de marzo de 2012 a las 23:18

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

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

  • gracias, pero está en el método principal, y ‘esto’ no se puede usar en métodos estáticos. cualquier trabajo a su alrededor?

    – La bla bla

    15/03/2012 a las 22:41

  • stackoverflow.com/questions/936684/…

    – La uña

    15 de marzo de 2012 a las 22:44

avatar de usuario
Jon Egeland

hay una clase, Classque 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 c representaba la clase MyClass en el paquete mypackageel código anterior imprimiría:

Paquete: mi paquete
Clase: Mi Clase
Identificador completo: mypackage.MyClass

Puedes tomar esta información y modificarla para lo que necesites, o ir verifique la API para más información.

  • Tenga en cuenta que Class.forName(“MyClass”) solo funcionará si está en el paquete predeterminado (es decir, no tiene declaración de paquete).

    – La uña

    15 de marzo de 2012 a las 22:46

  • @TheNail cierto, y getName() devuelve el nombre del paquete junto con el nombre de la clase, editando ahora.

    -Jon Egeland

    15 de marzo de 2012 a las 22:47

  • Usar getSimpleName() para obtener solo el nombre de la clase sin el nombre del paquete.

    – La uña

    15 de marzo de 2012 a las 22:48

  • En vez de Class.forName("MyClass") Deberías usar MyClass.class a menos que realmente necesite el descubrimiento en tiempo de ejecución por alguna otra razón.

    – mjaggard

    4 de diciembre de 2015 a las 13:46

El nombre completo se obtiene de la siguiente manera:

String fqn = YourClass.class.getName();

Pero necesita leer un recurso de classpath. Así que usa

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

avatar de usuario
Md. Zahangir Alam

usar this.getClass().getName() Llegar packageName.className y use this.getClass().getSimpleName() para obtener solo el nombre de la clase

¿Ha sido útil esta solución?