2011-01-16 14 views
10

In riferimento a Java, mi piacerebbe staticamente conoscere il nome della classe della classe corrente. A è la classe madre di B. Vorrei avere una stringa statica in A (classe genitore) che contiene il nome classe della classe corrente, ma quando questa stringa statica fa riferimento in B (classe figlio), dovrebbe contenere il nome classe B. È possibile?Java: una classe parent può recuperare staticamente il nome classe di una classe figlio?

Esempio:

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

perché dovresti farlo come si può ottenere il nome di classe in altri modi? –

+0

Per cosa ti serve? –

+2

A volte ho desiderato che anche questo fosse possibile. Ma non lo è. La parola 'static' significa già che un membro/metodo, ecc. È * staticamente * collegato alla classe che lo contiene. Non puoi sovrascriverlo - come quando il collegamento è fatto * dinamicamente * per esempio membri/metodi –

risposta

9

L'unico modo che conosco è il seguente: crea costruttore protetto che accetta String nella classe genitore.

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

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

BTW si può anche migliorare nel custructor di paren questo utilizzando new Throwable().getStackTrace(). In questo caso non devi nemmeno obbligare tutti i bambini a passare il loro nome al genitore.

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

Oooh, che puzza di pesce! 'trace [1] .getClassName();' ... Bella idea però :) –

+1

Se vuoi seguire questa direzione hacky, preferisco usare 'Thread # getStackTrace()' dato che ciò ti evita inutili e relativamente costruzione costosa dell'eccezione e clonazione dello stacktrace. Fornire a un costruttore astratto un argomento è IMO la strada da percorrere. – BalusC

+0

@BalusC: lo svantaggio del costruttore astratto è che ogni istanza contiene una copia della stringa, che è uno spreco di memoria rispetto a un campo statico. –

4

No, questo non è possibile. C'è solo una copia della stringa statica (per ClassLoader), ma puoi avere più sottoclassi.

È tuttavia possibile avere un campo statico per (sotto) classe, e quindi utilizzare un metodo

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

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

Questa è una tecnica che può essere utilizzato per evitare Reflection (il nome non poi spesso non uguale il nome della classe, ma usa qualche alias - può anche essere usato con enumerazioni invece di stringhe).

+0

Grazie mille amico :) solo le cose ho preso packagename.class questo non è un problema, ma questo è stato molto utile – HkFreaKuser1673718

1

provare questo codice, anche se non si poteva farlo utilizzando variabile statica

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

e farlo per le sottoclassi richieste

Problemi correlati