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 files
vive 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?
Respuestas:
Ú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.
fuente
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
c
representa la claseMyClass
en el paquetemypackage
, el código anterior se imprimiría:Puede tomar esta información y modificarla para lo que necesite, o consulte la API para obtener más información.
fuente
getName()
devuelve el nombre del paquete junto con el nombre de la clase, editando ahora.getSimpleName()
para obtener solo el nombre de la clase sin el nombre del paquete.Class.forName("MyClass")
debería usarlo aMyClass.class
menos que realmente necesite el descubrimiento en tiempo de ejecución por alguna otra razón.El nombre completo se obtiene de la siguiente manera:
Pero necesitas leer un recurso classpath. Así que usa
InputStream in = YourClass.getResourceAsStream("resource.txt");
fuente
usar
this.getClass().getName()
para obtenerpackageName.className
y usarthis.getClass().getSimpleName()
para obtener solo el nombre de la clasefuente