2017-03-21 3 views
0

ich diese Frage mit meiner begrenzten Kenntnis der Java-Reflexion und AOP.Wie Parameternamen in aspectj Beratung Klasse zu bekommen?

Hintergrund:

Ich verwende Anmerkung basierte Beratung in meiner Java 7-Anwendung. Weiterhin ist den Methodenparameter zu erhalten, die ich in meinem Rat verwenden, muß ich Frühling EL verwenden. Im folgenden sehen Sie Beispiele: Im ersten Beispiel i zweiten Parameter verwenden möchten, meine Arbeit zu tun, während in der zweiten Beispiel, das ich ein POJO bin mit und wollen ihre „id“ Feld verwenden.

@MyAnnotation(param = "args[1]") 
public void someMethod(int param1, String param2) { 
    return null; 
} 

@MyAnnotation(param = "args[0].id") 
public void someMethod(SomeObject someObject) { 
    return null; 
} 

Aber was ich will eigentlich ist, meine Hände auf den Parameternamen in meinem AOP zu erhalten. Also das kann ich @MyAnnotation (Param = "param1") oder @MyAnnotation (Param = "someObject.id") stattdessen verwenden.

Von dem, was ich kenne, können Sie Parameternamen nicht erhalten mithilfe von Reflektion. Aber vor kurzem stieß ich auf Frühling Cache Abstraktion (link), wo ich sehe:

@Cacheable(cacheNames="books", key="#isbn") 
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed) 

Kann jemand etwas Licht setzen hier, wie ich ein ähnliches Verhalten erreichen können.

Antwort

0

Siehe MethodBasedEvaluationContext und ParameterNameDiscoverer.

CacheEvaluationContext ist eine Unterklasse von MethodBasedEvaluationContext.

Code here ...

// Expose indexed variables as well as parameter names (if discoverable) 
    String[] paramNames = this.parameterNameDiscoverer.getParameterNames(this.method); 
    int paramCount = (paramNames != null ? paramNames.length : this.method.getParameterCount()); 
    int argsCount = this.arguments.length; 

    for (int i = 0; i < paramCount; i++) { 
     Object value = null; 
     if (argsCount > paramCount && i == paramCount - 1) { 
      // Expose remaining arguments as vararg array for last parameter 
      value = Arrays.copyOfRange(this.arguments, i, argsCount); 
     } 
     else if (argsCount > i) { 
      // Actual argument found - otherwise left as null 
      value = this.arguments[i]; 
     } 
     setVariable("a" + i, value); 
     setVariable("p" + i, value); 
     if (paramNames != null) { 
      setVariable(paramNames[i], value); 
     } 
    }