Disons que j'ai une situation comme celle-ci: et je veux le remplacer par une annotation comme celle-ci: p> Cela semble être une solution meilleure et plus claire, mais j'ai besoin de méthode StringForthisVisibilité pour connaître la valeur de @Visbilibylevel avec une sorte de réflexion. Est-ce possible? Puis-je voir les annotations sur la méthode appelant stringforthisvisVisibilité? P> p>
3 Réponses :
Oui, vous pourriez.
Quelque chose le long des lignes de Le code ci-dessus recherche des annotations sur la classe. Vous pouvez combiner le nom de la classe et le nom de la méthode (également à partir de l'élément Trace de pile) et d'aller regarder la méthode. Notez que cela est extrêmement lent. p> p>
C'est la seule solution que je connaisse aussi. Ce n'est pas garanti de travailler dans toutes les situations: si le chargeur de classe qui chargée de la classe appelée ne connaît pas la classe d'appel (et aucun de ses chargeurs de classes parent), l'appel à class.forname () code > va échouer.
Cette technique est fragile (que si votre méthode n'était pas appelée directement à partir d'une méthode annotée? Vous auriez besoin de boucler la pile. Et si l'annotation est sur une méthode de superclasse et non sur la méthode d'appelage directement? Vous auriez besoin de boucle sur les superclasses ...) et si Philipp a raison, il peut bousiller pour des environnements complexes (J2EE? Osgi?). C'est aussi très lent. Vous pouvez opter pour une solution qui utilise un marqueur fillocal et définissez le marqueur avant d'appeler la méthode, mais cela ressemblerait également étrange. Peut-être que si vous pouviez décrire ce que vous essayez exactement de faire une solution élégante pourrait être trouvée
Vous devez obtenir le Cependant, nous pouvons toujours obtenir la méthode Cela peut prendre des expériences, mais vous devriez trouver quel index dans ce tableau représente la méthode qui vous intéresse (ce sera probablement le premier, deuxième ou troisième Une fois que vous avez le Une fois que vous avez la méthode code> code>, il s'agit simplement d'appeler Méthode code>
objet qui représente la méthode appelée stressforthisvisVisibilité code>. Malheureusement, Java n'offre pas cette fonctionnalité hors de la boîte. P>
code> via les informations renvoyées par
thread.currentThread (). GetStackTrace () code>
. Cette méthode renvoie une gamme de StackTraceElement code>
objets. Chaque StackTraceElementElement code> nous dit trois choses: P>
getClassName () code>
) li>
getMethodName () code>
) li>
getlinenumber () code>
) li>
ul>
StackTraceElement code> dans le tableau). p>
StackTraceElement CODE>, vous pouvez obtenir sa méthode code> correspondante code> à l'aide de la technique dans Ma réponse à la question intitulée " Obtenez la méthode de l'appelant (java.lang.reflect.method) "< / a>. Cette technique sera toujours mot, même si la classe a plus d'une méthode avec ce nom de méthode. Il y a des techniques plus simples si vous n'êtes pas inquiet pour ce scénario. P>
méthode.Getannotation (visibilitéLevel.class) code>
. P>
Avec la classe suivante:
/** * Proper use of this class is * String testName = (new Util.MethodNameHelper(){}).getName(); * or * Method me = (new Util.MethodNameHelper(){}).getMethod(); * the anonymous class allows easy access to the method name of the enclosing scope. */ public static class MethodNameHelper { public String getName() { final Method myMethod = this.getClass().getEnclosingMethod(); if (null == myMethod) { // This happens when we are non-anonymously instantiated return this.getClass().getSimpleName() + ".unknown()"; // return a less useful string } final String className = myMethod.getDeclaringClass().getSimpleName(); return className + "." + myMethod.getName() + "()"; } public Method getMethod() { return this.getClass().getEnclosingMethod(); } }