2011-01-16 12 views
10

En referencia a Java, me gustaría saber estáticamente el nombre de clase de la clase actual. A es la clase padre de B. Me gustaría tener una cadena estática en A (clase padre) que contiene el nombre de clase de la clase actual, pero cuando esta cadena estática se hace referencia en B (clase hija), debe contener el nombre de clase de B. es posible?Java: ¿Puede una clase padre recuperar estáticamente el nombre de clase de una clase secundaria?

Ejemplo:

public class Parent { 

protected static String MY_CLASS_NAME = ??? 
. 
. 
. 
} 

public class Child extends Parent { 

public void testMethod() { 
    if (MY_CLASS_NAME.equals(getClass().getName())) { 
     System.out.println("We're equal!"); 
    } 
} 

} 
+0

¿Por qué haces que como se puede obtener el nombre de la clase de otras maneras? –

+0

¿Para qué lo necesitas? –

+2

A veces deseé que esto fuera posible. Pero no lo es. La palabra 'static 'ya significa que un miembro/método, etc. está * estáticamente * vinculado a la clase que lo contiene. No puede anularlo, como cuando se realiza el enlace * dinámicamente * por ejemplo miembros/métodos –

Respuesta

9

La única forma que conozco es la siguiente: create protected constructor que acepta String en la clase principal.

class Parent { 
    private final String className; 
    protected Parent(String className) { 
     this.className = className; 
    } 
} 

public class Child extends Parent { 
    public Child() { 
     super("Child"); 
    } 
} 

Por cierto incluso se puede mejorar esta usando new Throwable().getStackTrace() en custructor de paren. En este caso, ni siquiera tiene que hacer cumplir a todos los niños para pasar su nombre a los padres.

class Parent { 
    private final String className; 
    protected Parent() { 
     StackTraceElement[] trace = new Throwable().getStackTrace(); 
     this.className = trace[1].getClassName(); 
    } 
} 
+0

¡Oooh, eso huele a pescado! 'trace [1] .getClassName();' ... Buena idea :) –

+1

Si quieres ir a esta dirección hacky de todos modos, prefiero usar 'Thread # getStackTrace()' ya que eso te evita innecesarias y relativamente construcción costosa de la excepción y clonación de stacktrace. Proporcionar un constructor abstracto que tome un argumento es IMO el camino a seguir. – BalusC

+0

@BalusC: la desventaja del constructor abstracto es que cada instancia contiene una copia de la cadena, que es una pérdida de memoria en comparación con un campo estático. –

4

No, eso no es posible. Solo hay una copia de la Cadena estática (por ClassLoader), pero puede tener múltiples subclases.

Puede sin embargo tener un campo estático por clase (sub-), y luego usar un método

public class Child extends Parent { 
    private static final String NAME = "some alias"; 

    @Override 
    public String getName() { 
     return NAME; 
    } 
} 

Esta es una técnica que se puede utilizar para evitar la reflexión (el nombre entonces a menudo no es igual el nombre de la clase, pero usa algunos alias; también se puede usar con enumeraciones en lugar de cadenas).

+0

Muchas gracias, hombre :) Sólo las cosas me dan packagename.class, eso no es un problema, pero esto fue muy útil – HkFreaKuser1673718

1

tratar este código aunque no se podía hacer mediante la variable estática

class Parent{ 
    final String className; 
    public Parent(){ 
    className=this.getClass().getName(); 
    } 
    } 

y hacer eso por subclases requeridos

Cuestiones relacionadas