/* * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package java.lang.reflect; import java.lang.annotation.*; import java.util.Objects; import sun.reflect.annotation.AnnotationSupport; import sun.reflect.annotation.AnnotationType; /** * This class provides static utility methods to be called by * implementations of {@link AnnotatedElement}, including the default * methods in that interface. */ class AnnotatedElementSupport { public static T[] getAnnotationsByTypeDeclaredOrNot(AnnotatedElement element, Class annotationClass, boolean declared) { Objects.requireNonNull(annotationClass); T annotation = (declared ? element.getDeclaredAnnotation(annotationClass): element.getAnnotation(annotationClass)); @SuppressWarnings("unchecked") T[] annotations = (T[]) Array.newInstance(annotationClass, 0); int resultSize = 0; // If the annotation type is directly present, return it boxed // in an array. if (annotation != null) { resultSize = 1; } else { // Otherwise, if the annotation type is repeatable, // look through a container if one is present Repeatable repeatable = annotationClass.getAnnotation(Repeatable.class); if (repeatable != null) { // T is a repeatable annotation type Class containerType = repeatable.value(); Annotation container = (declared ? element.getDeclaredAnnotation(containerType): element.getAnnotation(containerType)); if (container != null) { annotations = AnnotationSupport.getValueArray(container); resultSize = annotations.length; if (resultSize == 1) annotation = annotations[0]; } } } @SuppressWarnings("unchecked") T[] returnValue = (T[]) Array.newInstance(annotationClass, resultSize); switch (resultSize) { case 0: break; // Nothing else do to case 1: returnValue[0] = annotation; break; default: for (int i = 0; i < resultSize; i++) { returnValue[i] = annotations[i]; } break; } return returnValue; } }