/*
 * Copyright 2002-2015 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.core.type;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Map;

import org.springframework.core.annotation.AnnotatedElementUtils;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.MultiValueMap;

MethodMetadata implementation that uses standard reflection to introspect a given Method.
Author:Juergen Hoeller, Mark Pollack, Chris Beams, Phillip Webb
Since:3.0
/** * {@link MethodMetadata} implementation that uses standard reflection * to introspect a given {@code Method}. * * @author Juergen Hoeller * @author Mark Pollack * @author Chris Beams * @author Phillip Webb * @since 3.0 */
public class StandardMethodMetadata implements MethodMetadata { private final Method introspectedMethod; private final boolean nestedAnnotationsAsMap;
Create a new StandardMethodMetadata wrapper for the given Method.
Params:
  • introspectedMethod – the Method to introspect
/** * Create a new StandardMethodMetadata wrapper for the given Method. * @param introspectedMethod the Method to introspect */
public StandardMethodMetadata(Method introspectedMethod) { this(introspectedMethod, false); }
Create a new StandardMethodMetadata wrapper for the given Method, providing the option to return any nested annotations or annotation arrays in the form of AnnotationAttributes instead of actual Annotation instances.
Params:
  • introspectedMethod – the Method to introspect
  • nestedAnnotationsAsMap – return nested annotations and annotation arrays as AnnotationAttributes for compatibility with ASM-based AnnotationMetadata implementations
Since:3.1.1
/** * Create a new StandardMethodMetadata wrapper for the given Method, * providing the option to return any nested annotations or annotation arrays in the * form of {@link org.springframework.core.annotation.AnnotationAttributes} instead * of actual {@link java.lang.annotation.Annotation} instances. * @param introspectedMethod the Method to introspect * @param nestedAnnotationsAsMap return nested annotations and annotation arrays as * {@link org.springframework.core.annotation.AnnotationAttributes} for compatibility * with ASM-based {@link AnnotationMetadata} implementations * @since 3.1.1 */
public StandardMethodMetadata(Method introspectedMethod, boolean nestedAnnotationsAsMap) { Assert.notNull(introspectedMethod, "Method must not be null"); this.introspectedMethod = introspectedMethod; this.nestedAnnotationsAsMap = nestedAnnotationsAsMap; }
Return the underlying Method.
/** * Return the underlying Method. */
public final Method getIntrospectedMethod() { return this.introspectedMethod; } @Override public String getMethodName() { return this.introspectedMethod.getName(); } @Override public String getDeclaringClassName() { return this.introspectedMethod.getDeclaringClass().getName(); } @Override public String getReturnTypeName() { return this.introspectedMethod.getReturnType().getName(); } @Override public boolean isAbstract() { return Modifier.isAbstract(this.introspectedMethod.getModifiers()); } @Override public boolean isStatic() { return Modifier.isStatic(this.introspectedMethod.getModifiers()); } @Override public boolean isFinal() { return Modifier.isFinal(this.introspectedMethod.getModifiers()); } @Override public boolean isOverridable() { return (!isStatic() && !isFinal() && !Modifier.isPrivate(this.introspectedMethod.getModifiers())); } @Override public boolean isAnnotated(String annotationName) { return AnnotatedElementUtils.isAnnotated(this.introspectedMethod, annotationName); } @Override @Nullable public Map<String, Object> getAnnotationAttributes(String annotationName) { return getAnnotationAttributes(annotationName, false); } @Override @Nullable public Map<String, Object> getAnnotationAttributes(String annotationName, boolean classValuesAsString) { return AnnotatedElementUtils.getMergedAnnotationAttributes(this.introspectedMethod, annotationName, classValuesAsString, this.nestedAnnotationsAsMap); } @Override @Nullable public MultiValueMap<String, Object> getAllAnnotationAttributes(String annotationName) { return getAllAnnotationAttributes(annotationName, false); } @Override @Nullable public MultiValueMap<String, Object> getAllAnnotationAttributes(String annotationName, boolean classValuesAsString) { return AnnotatedElementUtils.getAllAnnotationAttributes(this.introspectedMethod, annotationName, classValuesAsString, this.nestedAnnotationsAsMap); } }