jaki sposób whoAmI()
dostępu nazwa typu jest „o nazwie z”?
Możesz uzyskać dostęp do superklasę użyciu Class.getSuperclass()
:
void whoAmI() {
Class superclass = getClass().getSuperclass();
String superclassText = "no superclass found";
if (superclass != null) superclassText = superclass.getName();
System.out.println(superclassText);
}
to technicznie odpowiedzi na swoje pytania, ale tylko dlatego, że zakłada się, że metoda omawiamy należy do nadrzędnej (który to robi w swoim przykładzie).
Ale może naprawdę chcesz znać odpowiedź na "W jaki sposób metoda może zidentyfikować, która klasa jest zdefiniowana, nawet jeśli jest wywoływana na instancji podklasy?" To byłaby znacznie bardziej skomplikowana sprawa. Podczas gdy java.lang.reflect.Method.getDeclaringClass()
wydaje się robić to, o co prosisz, musisz najpierw zadeklarować instancję klasy "Class
(tj. SuperTest.class
), która pokonuje punkt - gdybyś to miał, nie musiałbyś w ogóle używać metody java.lang.reflect.Method.
Jednakże, jeśli mogę zmienić przesłankę trochę więcej, załóżmy osadzić każdy klasa ze statycznym instancji klasy jak ten:
private final static Class THIS_CLASS = SuperTest.class;
Wtedy staje się możliwe, aby napisać metodę który nie ma dostępu klasę uznającą po imieniu, bo może założyć, że cokolwiek robi klasa kopiowaniem wklejone będą miały THIS_CLASS
zdefiniowane:
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);
}
Da to I am packagename.MinsSuperTest.whoAmI()
jako wynik.
Dzięki. Czy to znaczy, że nie ma dynamicznego sposobu na poznanie typu, w którym zdefiniowana jest dana metoda? Musimy zawsze zapewnić wartość statyczną? – mins
@mins Możesz znaleźć klasę, w której metoda jest zdefiniowana za pomocą interfejsów API do refleksji, ale zwykle dostarczanie statycznego typu jest łatwiejsze. – dasblinkenlight
Ups, miałem na myśli "klasę, z której metoda jest nazywana". Obawiam się, że odpowiedź nadal będzie ważna. – mins