méthodes d'appel magiquement en Java
-
27-10-2019 - |
Question
Est-il possible d'utiliser des méthodes magiques en Java comme il y a en PHP avec __call
?
Par exemple:
class foo {
@Setter @Getter
int id;
@Getter
Map <String, ClassInFoo> myMap;
protected class ClassInFoo {
@Setter @Getter
String name;
}
@Setter
String defaultKey;
}
J'utilise projet Lombok les annotations pour les méthodes getter et setter pour simplifier le code.
Considérons que que ma carte contient plusieurs éléments cartographiés par chaîne et la defaultKey définit une par défaut.
Ce que je voudrais est de pouvoir appeler foo.getName()
qui retourne le nom par défaut comme foo.myMap.get(defaultKey).getName()
.
La raison pour laquelle je ne peux pas simplement écrire tous les getters manuellement que la classe Foo est en fait hérité des génériques et la classe interne peut être différent.
Je sorte de besoin de quelque chose comme:
function Object __call(method) {
if (exist_method(this.method)
return this.method();
else
return this.myMap.get(defaultKey).method();
}
Est-ce possible en quelque sorte en Java?
EDIT:
J'ai fait un exemple plus précis de ce que je suis en train de réaliser ici: https://gist.github.com / 1864457
La seule raison de le faire est de « sténographie » les méthodes de la classe interne.
La solution
Vous ne pouvez absolument par le biais réflexion en utilisant ses fonctionnalités telles que
public Method getMethod(String name, Class<?>... parameterTypes)
qui peut être utilisé pour voir si une classe a des méthodes définies mais je ne vois pas comment votre problème n'a pas pu être résolu avec une bonne utilisation des interfaces, l'héritage et en remplaçant des méthodes
Des caractéristiques comme la réflexion sont prévus pour gérer certains, sinon impossibles à résoudre, les problèmes, mais Java n'est pas PHP de sorte que vous devriez essayer d'éviter de l'utiliser lorsque cela est possible, étant donné que ce n'est pas dans la philosophie de la langue.
Autres conseils
est-il pas le point entier de l'héritage et en remplaçant?
Classe de base:
public Object foo() {
return this.myMap.get(defaultKey).method();
}
Sous-classe:
@Overrides
public Object foo() {
return whateverIWant;
}