Java: ¿obtienes el nombre de la clase actual?

4 minutos de lectura

avatar de usuario
ariaxt

Todo lo que estoy tratando de hacer es obtener el nombre de la clase actual, y Java agrega una tontería inútil $1 hasta el final del nombre de mi clase. ¿Cómo puedo deshacerme de él y solo devolver el nombre de clase real?

String className = this.getClass().getName();

  • ¿Dónde estás llamando a esto? ¿Es desde dentro de una clase interna anónima? ¿Podría agregar más código que muestre detalles sobre la definición de la clase y desde dónde se llama a esta línea?

    – Plainjimbo

    7 junio 2011 a las 20:50


  • Entonces, todo lo que quieres es String className = getClass().getName().substring(0, getClass().getName().indexOf("$"))

    – josh.trow

    7 junio 2011 a las 21:01

  • Si lo consigues $1 entonces, porque el nombre de la clase es $1. Si esperas algo más, usa this en la clase correcta en lugar de la incorrecta.

    – ceving

    26 de septiembre de 2014 a las 13:06


Probar,

String className = this.getClass().getSimpleName();

Esto funcionará siempre que no lo use en un método estático.

  • En realidad, no, esto no funcionará. Esta pregunta indica que tiene una clase interna anónima y, en este caso, getSimpleName() devuelve ""

    – vikingsteve

    5 de diciembre de 2013 a las 8:18

  • Aunque esto no responde a la pregunta, esta publicación SO se encuentra actualmente entre los mejores resultados para “obtener el nombre de la clase Java” en Google, por lo que sigue siendo útil para la comunidad.

    – EdgeCaseBerg

    10/10/2014 a las 16:52


  • Devolverá el nombre sin el espacio de nombres del paquete. ¡Buena!

    – Oleg Abrazhev

    25 de enero de 2016 a las 10:56

avatar de usuario
Bozho

El “$1” no es “tonterías inútiles”. Si su clase es anónima, se adjunta un número.

Si no desea la clase en sí, sino su clase declarante, puede usar getEnclosingClass(). Por ejemplo:

Class<?> enclosingClass = getClass().getEnclosingClass();
if (enclosingClass != null) {
  System.out.println(enclosingClass.getName());
} else {
  System.out.println(getClass().getName());
}

Puede mover eso en algún método de utilidad estática.

Pero tenga en cuenta que este no es el nombre de la clase actual. La clase anónima es una clase diferente a la clase que la encierra. El caso es similar para las clases internas.

  • Pero, ¿y si la clase envolvente también es una clase interna anónima? ¿No tiene que obtener recursivamente la clase adjunta hasta que regrese? nully use el último no-null clase que tienes?

    – Garret Wilson

    07/01/2015 a las 16:15

avatar de usuario
destino reflejado

Intenta usar esto
this.getClass().getCanonicalName() o this.getClass().getSimpleName(). Si es una clase anónima, use this.getClass().getSuperclass().getName()

  • En realidad, lo hace. Dependiente. Si está tratando de obtener el nombre de la clase abstracta que está implementando con una clase anónima, esto es lo que usa.

    – Destino reflejado

    7 de junio de 2011 a las 21:04

  • para su caso (clase anónima), el nombre simple está vacío, el nombre canónico es nulo y la superclase es Objeto.

    – Bozho

    7 de junio de 2011 a las 21:07

  • Sí, sí, no. Mis dos primeros fueron solo conjeturas, el tercero, sin embargo, es correcto. Una clase anónima es una subclase de la clase que implementa. Por eso funcionan. Por lo tanto, la superclase es la clase abstracta.

    – Destino reflejado

    7 de junio de 2011 a las 21:09

  • Extraño, ¿no es la súper clase la clase de la que estás heredando? El controlador no hereda de mi clase, es solo un miembro

    – aryaxt

    7 junio 2011 a las 21:15

  • Umm… He probado esto, y entiendo que la superclase de la clase anónima es la clase abstracta. Volveré a revisar mi lógica… pero como estoy obteniendo el resultado que tiene sentido, no creo que haya sido yo quien cometió el error…

    – Destino reflejado

    7 junio 2011 a las 21:33

avatar de usuario
karuna

Puedes usar this.getClass().getSimpleName()al igual que:

import java.lang.reflect.Field;

public class Test {

    int x;
    int y;  

    public String getClassName() {

        String className = this.getClass().getSimpleName(); 
        System.out.println("Name:" + className);
        return className;
    }

    public Field[] getAttributes() {

        Field[] attributes = this.getClass().getDeclaredFields();   
        for(int i = 0; i < attributes.length; i++) {
            System.out.println("Declared Fields" + attributes[i]);    
        }

        return attributes;
    }

    public static void main(String args[]) {

        Test t = new Test();
        t.getClassName();
        t.getAttributes();
    }
}

La combinación de ambas respuestas. También imprime un nombre de método:

Class thisClass = new Object(){}.getClass();
String className = thisClass.getEnclosingClass().getSimpleName();
String methodName = thisClass.getEnclosingMethod().getName();
Log.d("app", className + ":" + methodName);

avatar de usuario
jason hu

esta respuesta llega tarde, pero creo que hay otra forma de hacerlo en el contexto de la clase de controlador anónimo.

digamos:

class A {
    void foo() {
        obj.addHandler(new Handler() {
            void bar() {
                String className=A.this.getClass().getName();
                // ...
            }
        });
    }
}

logrará el mismo resultado. además, en realidad es bastante conveniente ya que cada clase se define en tiempo de compilación, por lo que no se daña la dinámica.

por encima de eso, si la clase está realmente anidada, es decir A en realidad está encerrado por Bla clase de B se puede conocer fácilmente como:

B.this.getClass().getName()

avatar de usuario
Ako

Aquí hay una variante de Android, pero el mismo principio también se puede usar en Java simple.

private static final String TAG = YourClass.class.getSimpleName();
private static final String TAG = YourClass.class.getName();

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad