7
votes

Voir Annotations Java sur la méthode d'appel

Disons que j'ai une situation comme celle-ci: xxx

et je veux le remplacer par une annotation comme celle-ci: xxx

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é?


0 commentaires

3 Réponses :


6
votes

Oui, vous pourriez. Quelque chose le long des lignes de xxx

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.


2 commentaires

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 () 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



7
votes

Vous devez obtenir le Méthode objet qui représente la méthode appelée stressforthisvisVisibilité . Malheureusement, Java n'offre pas cette fonctionnalité hors de la boîte.

Cependant, nous pouvons toujours obtenir la méthode via les informations renvoyées par thread.currentThread (). GetStackTrace () . Cette méthode renvoie une gamme de StackTraceElement objets. Chaque StackTraceElementElement nous dit trois choses:


0 commentaires

8
votes

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();
    }
  }


0 commentaires