Fix 154 - expose method annotations via new MethodReference
diff --git a/api/src/main/java/jakarta/el/MethodExpression.java b/api/src/main/java/jakarta/el/MethodExpression.java
index 83668a2..2136e29 100644
--- a/api/src/main/java/jakarta/el/MethodExpression.java
+++ b/api/src/main/java/jakarta/el/MethodExpression.java
@@ -110,4 +110,31 @@
public boolean isParametersProvided() {
return false;
}
+
+ /**
+ * Obtain the {@link MethodReference} for the method to which this method
+ * expression resolves.
+ *
+ * @param context The EL context for this evaluation
+ *
+ * @return This default implementation always returns <code>null</code>
+ *
+ * @throws NullPointerException
+ * If the supplied context is <code>null</code>
+ * @throws PropertyNotFoundException
+ * If a property/variable resolution failed because no match
+ * was found or a match was found but was not readable
+ * @throws MethodNotFoundException
+ * If no matching method can be found
+ * @throws ELException
+ * Wraps any exception throw whilst resolving the property
+ *
+ * @since EL 5.0
+ */
+ public MethodReference getMethodReference(ELContext context) {
+ // Expected to be over-ridden by implementations
+ context.notifyBeforeEvaluation(getExpressionString());
+ context.notifyAfterEvaluation(getExpressionString());
+ return null;
+ }
}
diff --git a/api/src/main/java/jakarta/el/MethodReference.java b/api/src/main/java/jakarta/el/MethodReference.java
new file mode 100644
index 0000000..5d4e39a
--- /dev/null
+++ b/api/src/main/java/jakarta/el/MethodReference.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+package jakarta.el;
+
+import java.lang.annotation.Annotation;
+
+/**
+ * Provides information about the method to which a method expression resolves.
+ */
+public class MethodReference {
+
+ private final Object base;
+ private final MethodInfo methodInfo;
+ private final Annotation[] annotations;
+ private final Object[] evaluatedParameters;
+
+
+ public MethodReference(Object base, MethodInfo methodInfo, Annotation[] annotations, Object[] evaluatedParameters) {
+ this.base = base;
+ this.methodInfo = methodInfo;
+ this.annotations = annotations;
+ this.evaluatedParameters = evaluatedParameters;
+ }
+
+
+ /**
+ * Obtain the base object on which the method will be invoked.
+ *
+ * @return The base object on which the method will be invoked or
+ * {@code null} for literal method expressions.
+ */
+ public Object getBase() {
+ return base;
+ }
+
+
+ /**
+ * Obtain the {@link MethodInfo} for the {@link MethodExpression} for which
+ * this {@link MethodReference} has been generated.
+ *
+ * @return The {@link MethodInfo} for the {@link MethodExpression} for which
+ * this {@link MethodReference} has been generated.
+ */
+ public MethodInfo getMethodInfo() {
+ return this.methodInfo;
+ }
+
+
+ /**
+ * Obtain the annotations on the method to which the associated expression
+ * resolves.
+ *
+ * @return The annotations on the method to which the associated expression
+ * resolves. If the are no annotations, then an empty array is
+ * returned.
+ */
+ public Annotation[] getAnnotations() {
+ return annotations;
+ }
+
+
+ /**
+ * Obtain the evaluated parameter values that will be passed to the method
+ * to which the associated expression resolves.
+ *
+ * @return The evaluated parameters.
+ */
+ public Object[] getEvaluatedParameters() {
+ return evaluatedParameters;
+ }
+}
diff --git a/spec/src/main/asciidoc/ELSpec.adoc b/spec/src/main/asciidoc/ELSpec.adoc
index fb85d8c..18e4c1c 100644
--- a/spec/src/main/asciidoc/ELSpec.adoc
+++ b/spec/src/main/asciidoc/ELSpec.adoc
@@ -2961,6 +2961,11 @@
Remove the deprecated, mis-spelt method
`MethodExpression#isParmetersProvided()` from the API
+* https://github.com/eclipse-ee4j/el-ri/issues/154[#154]
+ Add the `MethodReference` class to provide access to details of the method to
+ which a `MethodExpression` resolves, including any annotations present on the
+ method.
+
* https://github.com/eclipse-ee4j/el-ri/issues/157[#157]
Generics are now used where appropriate throughout the API