come può whoAmI()
accesso il nome del tipo è "chiamato da"?
È possibile accedere alla superclasse utilizzando Class.getSuperclass()
:
void whoAmI() {
Class superclass = getClass().getSuperclass();
String superclassText = "no superclass found";
if (superclass != null) superclassText = superclass.getName();
System.out.println(superclassText);
}
Questo risponde tecnicamente alla tua domanda, ma solo perché ho assunto che il metodo stiamo discutendo appartiene alla superclasse (cosa che fa nel tuo esempio).
Ma forse si vuole veramente sapere la risposta a "Come può un metodo identificare quale classe è definita anche se è invocata su un'istanza di una sottoclasse?" Questa sarebbe una questione molto più complicata. Mentre java.lang.reflect.Method.getDeclaringClass()
sembra fare quello che chiedi, per prima cosa hai bisogno dell'istanza di classe Class
della classe dichiarante (ad esempio, SuperTest.class
) che sconfigge il punto: se lo avessi fatto, non avresti bisogno di usare java.lang.reflect.Method.
Tuttavia, se posso cambiare la premessa un po 'di più, supponiamo di incorporare ogni classe con un'istanza di classe statico come questo:
private final static Class THIS_CLASS = SuperTest.class;
Allora diventa possibile scrivere un metodo di che non accede sua classe dichiarando per nome, perché si può supporre che a seconda di quale classe si ottiene copia-incollato avrà THIS_CLASS
definito:
void whoAmI() {
final String myName = "whoAmI";
final Class[] myParamTypes = {};
String result;
try {
Method thisMethod = THIS_CLASS.getDeclaredMethod(myName, myParamTypes);
result = "I am " + thisMethod.getDeclaringClass().getName() + "." +
myName + Arrays.toString(myParamTypes);
// Now swap the square brackets from Arrays.toString for parentheses
result = result.replaceAll("\\[", "\\(").replaceAll("\\]", "\\)");
} catch (NoSuchMethodException | SecurityException ex) {
result = ex.toString();
}
System.out.println(result);
}
Ciò produrrà I am packagename.MinsSuperTest.whoAmI()
come output.
Grazie. Significa che non esiste un modo dinamico per conoscere il tipo in cui è definito un metodo? Dobbiamo sempre fornire un valore statico? – mins
@mins È possibile trovare la classe in cui il metodo viene definito utilizzando le API di reflection, ma in genere fornire un tipo statico è più semplice. – dasblinkenlight
Oops, intendevo "la classe da cui viene chiamato il metodo". Ma temo che la risposta sarà ancora valida. – mins