Java-obtener el nombre de la clase actual?


Todo lo que estoy tratando de hacer es obtener el nombre de la clase actual, y java añade un inútil no sentido $1 al final del nombre de mi clase. ¿Cómo puedo deshacerme de él y devolver solo el nombre real de la clase?

String className = this.getClass().getName();
Author: David, 2011-06-08

10 answers

El "$1" no es "inútil, sin sentido". Si su clase es anónima, se añade un número.

Si no quieres la clase en sí, sino su clase declarante, entonces puedes 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.

 214
Author: Bozho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-04 16:25:07

Try,

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

Esto funcionará siempre y cuando no lo uses en un método estático.

 181
Author: jesg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-12 20:41:34

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

 20
Author: MirroredFate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-02 07:47:08

Puedes usar this.getClass().getSimpleName(), así:

import java.lang.reflect.Field;

public class Test {

    int x;
    int y;  

    public void getClassName() {
        String className = this.getClass().getSimpleName(); 
        System.out.println("Name:" + className);
    }

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

    public static void main(String args[]) {

        Test t = new Test();
        t.getClassName();
        t.getAttributes();
    }
}
 8
Author: Karuna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-13 13:33:39

Esta respuesta es tardía, pero creo que hay otra manera de hacer esto en el contexto de la clase de manejador 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 dinamicidad.

Por encima de eso, si la clase está realmente anidada, es decir, A en realidad está encerrada por B, la clase de B puede ser fácilmente conocida como:

B.this.getClass().getName()
 3
Author: HuStmpHrrr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-23 21:40:11

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);
 3
Author: SoftDesigner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-29 22:14:18

En su ejemplo, this probablemente se refiere a una instancia de clase anónima. Java da un nombre a esas clases añadiendo un $number al nombre de la clase que las encierra.

 2
Author: tonio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-07 20:51:31

Asumo que esto está sucediendo para una clase anónima. Cuando creas una clase anónima, en realidad creas una clase que extiende la clase cuyo nombre obtuviste.

La forma" más limpia " de obtener el nombre que desea es:

Si tu clase es una clase interna anónima, getSuperClass() debería darte la clase desde la que fue creada. Si lo creaste desde una interfaz, entonces eres una especie de SOL porque lo mejor que puedes hacer es getInterfaces() que podría darte más de una interfaz.

El la forma" hacky " es simplemente obtener el nombre con getClassName() y usar una expresión regular para eliminar $1.

 1
Author: trutheality,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-07 21:06:24

He encontrado que esto funciona para mi código,, sin embargo, mi código está obteniendo la clase de una matriz dentro de un bucle for.

String className="";

className = list[i].getClass().getCanonicalName();

System.out.print(className); //Use this to test it works
 -3
Author: hransom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-13 14:05:41

API de reflexión

Hay varias API de reflexión que devuelven clases, pero estas pueden solo se puede acceder si una Clase ya se ha obtenido directamente o indirectamente.

Class.getSuperclass()
     Returns the super class for the given class.

        Class c = javax.swing.JButton.class.getSuperclass();
        The super class of javax.swing.JButton is javax.swing.AbstractButton.

        Class.getClasses()

Devuelve todas las clases públicas, interfaces y enums que son miembros de la clase incluyendo miembros heredados.

        Class<?>[] c = Character.class.getClasses();

El carácter contiene dos caracteres de clase miembro.Subconjunto y
Caracter.UnicodeBlock.

        Class.getDeclaredClasses()
         Returns all of the classes interfaces, and enums that are explicitly declared in this class.

        Class<?>[] c = Character.class.getDeclaredClasses();
     Character contains two public member classes Character.Subset and Character.UnicodeBlock and one private class

Carácter.Characcache.

        Class.getDeclaringClass()
        java.lang.reflect.Field.getDeclaringClass()
        java.lang.reflect.Method.getDeclaringClass()
        java.lang.reflect.Constructor.getDeclaringClass()
     Returns the Class in which these members were declared. Anonymous Class Declarations will not have a declaring class but will

Tienen una clase envolvente.

        import java.lang.reflect.Field;

            Field f = System.class.getField("out");
            Class c = f.getDeclaringClass();
            The field out is declared in System.
            public class MyClass {
                static Object o = new Object() {
                    public void m() {} 
                };
                static Class<c> = o.getClass().getEnclosingClass();
            }

     The declaring class of the anonymous class defined by o is null.

    Class.getEnclosingClass()
     Returns the immediately enclosing class of the class.

    Class c = Thread.State.class().getEnclosingClass();
     The enclosing class of the enum Thread.State is Thread.

    public class MyClass {
        static Object o = new Object() { 
            public void m() {} 
        };
        static Class<c> = o.getClass().getEnclosingClass();
    }
     The anonymous class defined by o is enclosed by MyClass.
 -3
Author: arunkumar sambu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-31 00:56:26