reflexion - Java-obtener el nombre de la clase actual?
reflection java 8 (10)
El "$ 1" no es "sin sentido inútil". Si su clase es anónima, se anexa 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());
}
Puedes 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 de su clase adjunta. El caso es similar para las clases internas.
Todo lo que estoy tratando de hacer es obtener el nombre de la clase actual, y Java agrega un inútil $ 1 sin sentido al final de mi nombre de clase. ¿Cómo puedo deshacerme de él y devolver solo el nombre real de la clase?
String className = this.getClass().getName();
En su ejemplo, this
probablemente se refiere a una instancia de clase anónima. Java le da un nombre a esas clases agregando un $number
al nombre de la clase adjunta.
Estoy asumiendo que esto está sucediendo para una clase anónima. Cuando creas una clase anónima, creas una clase que extiende la clase cuyo nombre obtuviste.
La forma "más limpia" de obtener el nombre que desea es:
Si su clase es una clase interna anónima, getSuperClass()
debería darle la clase desde la que se creó. Si lo creó a partir de una interfaz que no es como SOL, lo mejor que puede hacer es getInterfaces()
que podría proporcionarle más de una interfaz.
La forma "hacky" es obtener el nombre con getClassName()
y usar una expresión regular para soltar los $1
.
He encontrado que esto funciona para mi código, sin embargo, mi código está sacando a 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
Intente usar este this.getClass().getCanonicalName()
o this.getClass().getSimpleName()
. Si es una clase anónima, usa this.getClass().getSuperclass().getName()
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);
Puede 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();
}
}
Tratar,
String className = this.getClass().getSimpleName();
Esto funcionará siempre y cuando no lo uses en un método estático.
esta respuesta es tardía, pero creo que hay otra forma de hacerlo 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 dinamismo.
por encima de eso, si la clase está realmente anidada, es decir, A
realidad está encerrada por B
, la clase de B puede ser conocida fácilmente como:
B.this.getClass().getName()
Hay varias API de Reflection que devuelven clases, pero solo se puede acceder a ellas si una Clase ya se ha obtenido directa 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 enumeraciones que son miembros de la clase, incluidos los miembros heredados.
Class<?>[] c = Character.class.getClasses();
Carácter contiene dos clases miembro Character.Subset y
Character.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
Character.CharacterCache.
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
tener una clase de cierre.
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.