2012-03-15 15 views
56

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

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

El problema es que esto sólo 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 ignoraría el nombre del paquete donde están los archivos .class reales.

¿Alguna sugerencia?

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

sourcedir puede ser absoluta (comenzando con “/”) o en relación con donde se corre el programa desde

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

+2

¿Qué hará si el código está empaquetado en un JAR (o no está en una estructura de carpeta/archivo como lo 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 adquiera el hábito de hacer esa suposición para el código de calidad de producción. –

+0

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

+0

¿Tal vez podría ayudarme a comprender mejor el requisito? Necesito comprobar que la discusión comience con un '/' (mencione en la descripción). si lo hace, solo úsalo como absoluto. como es. pero si no lo hace, ¿cómo debería tratarlo? –

Respuesta

112

Usa 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/Clase C.) y que usar el nombre de paquete/clase para derivar una ruta es típicamente mala práctica. Los conjuntos de archivos/paquetes de clase pueden estar en múltiples rutas de clases diferentes, que pueden ser directorios o archivos jar.

+0

gracias, pero está en el método principal, y 'esto' no se puede usar en métodos estáticos. cualquier trabajo alrededor? –

+0

http://stackoverflow.com/questions/936684/getting-the-class-name-from-a-static-method-in-java –

+0

editado la pregunta. para explicar mejor –

16

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 representada la clase MyClass en el paquete mypackage, el código anterior imprimiría:

paquete: mypackage
Clase: MyClass
Full identifier: mypackage.MyClass

Puede tomar esta información y modificarla para lo que necesite, o vaya al check the API para obtener más información.

+0

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

+1

@TheNail true, y 'getName()' devuelve el nombre del paquete junto con el nombre de la clase, editando ahora. – Jon

+0

Use 'getSimpleName()' para obtener solo el nombre de clase sin el nombre del paquete. –

6

El nombre completo se opbtained de la siguiente manera:

String fqn = YourClass.class.getName(); 

pero hay que leer un recurso de ruta de clases. Entonces use

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