Merge "Revert "reflection: Add new AnnotatedElement 1.8 methods.""
diff --git a/luni/src/main/java/libcore/reflect/AnnotatedElements.java b/luni/src/main/java/libcore/reflect/AnnotatedElements.java
deleted file mode 100644
index 2fe2d2b..0000000
--- a/luni/src/main/java/libcore/reflect/AnnotatedElements.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * 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 libcore.reflect;
-
-import java.lang.annotation.Annotation;
-import java.lang.annotation.IncompleteAnnotationException;
-import java.lang.annotation.Repeatable;
-import java.lang.reflect.*;
-import java.util.ArrayList;
-
-/**
- * Implementation of {@link AnnotatedElement}'s 1.8 methods.
- *
- * <p>This implementation is shared between all the classes implementing {@link AnnotatedElement},
- * avoiding code duplication.</p>
- *
- * @hide
- */
-public final class AnnotatedElements {
- /**
- * Default implementation for {@link AnnotatedElement#getDeclaredAnnotation}.
- *
- * @return Directly present annotation of type {@code annotationClass} for {@code element},
- * or {@code null} if none was found.
- */
- public static <T extends Annotation> T getDeclaredAnnotation(AnnotatedElement element,
- Class<T> annotationClass) {
- if (annotationClass == null) {
- throw new NullPointerException("annotationClass");
- }
-
- Annotation[] annotations = element.getDeclaredAnnotations();
-
- // Safeguard: getDeclaredAnnotations should never return null.
- if (annotations == null) {
- return null;
- }
-
- // The annotation might be directly present:
- // Return the first (and only) annotation whose class matches annotationClass.
- for (int i = 0; i < annotations.length; ++i) {
- if (annotationClass.isInstance(annotations[i])) {
- return (T)annotations[i]; // Safe because of above guard.
- }
- }
-
- // The annotation was *not* directly present:
- // If the array was empty, or we found no matches, return null.
- return null;
- }
-
- /**
- * Default implementation for {@link AnnotatedElement#getDeclaredAnnotationsByType}.
- *
- * @return Directly/indirectly present list of annotations of type {@code annotationClass} for
- * {@code element}, or an empty array if none were found.
- */
- public static <T extends Annotation> T[] getDeclaredAnnotationsByType(AnnotatedElement element,
- Class<T> annotationClass) {
- if (annotationClass == null) {
- throw new NullPointerException("annotationClass");
- }
-
- Annotation[] annotations = element.getDeclaredAnnotations();
-
- // Store a list of repeatable annotations that have been extracted from their container.
- ArrayList<T> unfoldedAnnotations = new ArrayList<T>();
-
- Class<? extends Annotation> repeatableAnnotationClass =
- getRepeatableAnnotationContainerClassFor(annotationClass);
-
- for (int i = 0; i < annotations.length; ++i) {
- if (annotationClass.isInstance(annotations[i])) {
- // Is it directly present?
- unfoldedAnnotations.add((T)annotations[i]); // Safe, guarded by above check.
- } else if (repeatableAnnotationClass != null &&
- repeatableAnnotationClass.isInstance(annotations[i])) {
- // Is it repeatably (indirectly) present?
- insertAnnotationValues(annotations[i], annotationClass, unfoldedAnnotations);
- }
- }
-
- return unfoldedAnnotations.toArray((T[])Array.newInstance(annotationClass, 0));
- }
-
- /**
- * Extracts annotations from a container annotation and inserts them into a list.
- *
- * <p>
- * Given a complex annotation "annotation", it should have a "T[] value()" method on it.
- * Call that method and add all of the nested annotations into unfoldedAnnotations list.
- * </p>
- */
- private static <T extends Annotation> void insertAnnotationValues(Annotation annotation,
- Class<T> annotationClass, ArrayList<T> unfoldedAnnotations) {
- // annotation is a complex annotation which has elements of instance annotationClass
- // (whose static type is T).
- //
- // @interface SomeName { <--- = annotation.getClass()
- // ...
- // T[] value(); <--- T.class == annotationClass
- // }
- //
- // Use reflection to access these values.
- Class<T[]> annotationArrayClass =
- (Class<T[]>)((T[])Array.newInstance(annotationClass, 0)).getClass();
-
- Method valuesMethod;
- try {
- valuesMethod = annotation.getClass().getDeclaredMethod("value");
- // This will always succeed unless the annotation and its repeatable annotation class were
- // recompiled separately, then this is a binary incompatibility error.
- } catch (NoSuchMethodException e) {
- throw new AssertionError("annotation container = " + annotation +
- "annotation element class = " + annotationClass + "; missing value() method");
- } catch (SecurityException e) {
- throw new IncompleteAnnotationException(annotation.getClass(), "value");
- }
-
- // Ensure that value() returns a T[]
- if (!valuesMethod.getReturnType().isArray()) {
- throw new AssertionError("annotation container = " + annotation +
- "annotation element class = " + annotationClass + "; value() doesn't return array");
- }
-
- // Ensure that the T[] value() is actually the correct type (T==annotationClass).
- if (!annotationClass.equals(valuesMethod.getReturnType().getComponentType())) {
- throw new AssertionError("annotation container = " + annotation +
- "annotation element class = " + annotationClass + "; value() returns incorrect type");
- }
-
- // Append those values into the existing list.
- T[] nestedAnnotations;
- try {
- nestedAnnotations = (T[])valuesMethod.invoke(annotation); // Safe because of #getMethod.
- } catch (IllegalAccessException|InvocationTargetException e) {
- throw new AssertionError(e);
- }
-
- for (int i = 0; i < nestedAnnotations.length; ++i) {
- unfoldedAnnotations.add(nestedAnnotations[i]);
- }
- }
-
- /**
- * Find the {@code \@Repeatable} container annotation class for an annotation class, or
- * {@code null}.
- *
- * <p>
- * Given:
- *
- * <code>
- * @Repeatable(X.class)
- * @interface SomeName { <--- = annotationClass
- * }...
- * </code>
- *
- * <p>
- * Returns {@code X.class}
- *
- * Otherwise if there was no {@code \@Repeatable} annotation, return {@code null}.
- * </p>
- */
- private static <T extends Annotation> Class<? extends Annotation>
- getRepeatableAnnotationContainerClassFor(Class<T> annotationClass) {
-
- Repeatable repeatableAnnotation = annotationClass.getDeclaredAnnotation(Repeatable.class);
- return (repeatableAnnotation == null) ? null : repeatableAnnotation.value();
- }
-
- /**
- * Default implementation of {@link AnnotatedElement#getAnnotationsByType}.
- *
- * <p>
- * This method does not handle inherited annotations and is
- * intended for use for {@code Method}, {@code Field}, {@code Package}.
- * The {@link Class#getAnnotationsByType} is implemented explicitly.
- * </p>
- *
- * @return Associated annotations of type {@code annotationClass} for {@code element}.
- */
- public static <T extends Annotation> T[] getAnnotationsByType(AnnotatedElement element,
- Class<T> annotationClass) {
- if (annotationClass == null) {
- throw new NullPointerException("annotationClass");
- }
-
- // Find any associated annotations [directly or repeatably (indirectly) present on this class].
- T[] annotations = element.getDeclaredAnnotationsByType(annotationClass);
- if (annotations == null) {
- throw new AssertionError("annotations must not be null"); // Internal error.
- }
-
- // If nothing was found, we would look for associated annotations recursively up to the root
- // class. However this can only happen if AnnotatedElement is a Class, which is handled
- // in the Class override of this method.
- return annotations;
- }
-
- private AnnotatedElements() {
- throw new AssertionError("Instances of AnnotatedElements not allowed");
- }
-}
-
diff --git a/non_openjdk_java_files.mk b/non_openjdk_java_files.mk
index 856a3255..34d9aab9 100644
--- a/non_openjdk_java_files.mk
+++ b/non_openjdk_java_files.mk
@@ -381,7 +381,6 @@
luni/src/main/java/libcore/net/event/NetworkEventListener.java \
luni/src/main/java/libcore/net/http/HttpDate.java \
luni/src/main/java/libcore/net/http/ResponseUtils.java \
- luni/src/main/java/libcore/reflect/AnnotatedElements.java \
luni/src/main/java/libcore/reflect/AnnotationAccess.java \
luni/src/main/java/libcore/reflect/AnnotationFactory.java \
luni/src/main/java/libcore/reflect/AnnotationMember.java \
diff --git a/ojluni/src/main/java/java/lang/Class.java b/ojluni/src/main/java/java/lang/Class.java
index de378da..e952660 100755
--- a/ojluni/src/main/java/java/lang/Class.java
+++ b/ojluni/src/main/java/java/lang/Class.java
@@ -65,7 +65,6 @@
import java.lang.reflect.AccessibleObject;
import com.android.dex.Dex;
import dalvik.system.VMStack;
-import libcore.reflect.AnnotatedElements;
import libcore.reflect.AnnotationAccess;
import libcore.reflect.InternalNames;
import libcore.reflect.GenericSignatureParser;
@@ -2466,56 +2465,9 @@
@Override public native Annotation[] getDeclaredAnnotations();
/**
- * {@inheritDoc}
- * @since 1.8
- * @hide 1.8
+ * Returns the annotation if it exists.
*/
- @Override
- public <T extends Annotation> T[] getDeclaredAnnotationsByType(Class<T> annotationClass) {
- return AnnotatedElements.getDeclaredAnnotationsByType(this, annotationClass);
- }
-
- /**
- * {@inheritDoc}
- * @since 1.8
- * @hide 1.8
- */
- @Override
- public <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass) {
- // Find any associated annotations [directly or repeatably (indirectly) present on this].
- T[] annotations = AnnotatedElements.getAnnotationsByType(this, annotationClass);
-
- if (annotations.length != 0) {
- return annotations;
- }
-
- // Nothing was found, attempt looking for associated annotations recursively up to the root
- // class if and only if:
- // * The annotation class was marked with @Inherited.
- //
- // Inherited annotations are not coalesced into a single set: the first declaration found is
- // returned.
-
- if (annotationClass.isDeclaredAnnotationPresent(Inherited.class)) {
- Class<?> superClass = getSuperclass(); // Returns null if klass's base is Object.
-
- if (superClass != null) {
- return superClass.getAnnotationsByType(annotationClass);
- }
- }
-
- // Annotated was not marked with @Inherited, or no superclass.
- return (T[]) Array.newInstance(annotationClass, 0); // Safe by construction.
- }
-
- /**
- * {@inheritDoc}
- *
- * @since 1.8
- * @hide 1.8
- */
- @Override
- public native <T extends Annotation> T getDeclaredAnnotation(Class<T> annotationClass);
+ private native <A extends Annotation> A getDeclaredAnnotation(Class<A> annotationClass);
/**
* Returns true if the annotation exists.
diff --git a/ojluni/src/main/java/java/lang/Package.java b/ojluni/src/main/java/java/lang/Package.java
index 4fbbf29..0b1a036 100755
--- a/ojluni/src/main/java/java/lang/Package.java
+++ b/ojluni/src/main/java/java/lang/Package.java
@@ -53,8 +53,6 @@
import sun.reflect.CallerSensitive;
import dalvik.system.VMStack;
-import libcore.reflect.AnnotatedElements;
-
/**
* {@code Package} objects contain version information
* about the implementation and specification of a Java package.
@@ -415,35 +413,6 @@
}
/**
- * {@inheritDoc}
- * @since 1.8
- * @hide 1.8
- */
- @Override
- public <T extends Annotation> T[] getDeclaredAnnotationsByType(Class<T> annotationClass) {
- return AnnotatedElements.getDeclaredAnnotationsByType(this, annotationClass);
- }
-
- /**
- * {@inheritDoc}
- * @since 1.8
- * @hide 1.8
- */
- @Override
- public <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass) {
- return AnnotatedElements.getAnnotationsByType(this, annotationClass);
- }
-
- /**
- * {@inheritDoc}
- * @since 1.8
- * @hide 1.8
- */
- @Override
- public <T extends Annotation> Annotation getDeclaredAnnotation(Class<T> annotationClass) {
- return AnnotatedElements.getDeclaredAnnotation(this, annotationClass);
- }
- /**
* Construct a package instance with the specified version
* information.
* @param pkgName the name of the package
diff --git a/ojluni/src/main/java/java/lang/reflect/AccessibleObject.java b/ojluni/src/main/java/java/lang/reflect/AccessibleObject.java
index 68c8555..b7ace79 100755
--- a/ojluni/src/main/java/java/lang/reflect/AccessibleObject.java
+++ b/ojluni/src/main/java/java/lang/reflect/AccessibleObject.java
@@ -30,8 +30,6 @@
import sun.reflect.Reflection;
import java.lang.annotation.Annotation;
-import libcore.reflect.AnnotatedElements;
-
/**
* The AccessibleObject class is the base class for Field, Method and
* Constructor objects. It provides the ability to flag a reflected
@@ -195,34 +193,4 @@
public Annotation[] getDeclaredAnnotations() {
throw new AssertionError("All subclasses should override this method");
}
-
- /**
- * {@inheritDoc}
- * @since 1.8
- * @hide 1.8
- */
- @Override
- public <T extends Annotation> T[] getDeclaredAnnotationsByType(Class<T> annotationClass) {
- return AnnotatedElements.getDeclaredAnnotationsByType(this, annotationClass);
- }
-
- /**
- * {@inheritDoc}
- * @since 1.8
- * @hide 1.8
- */
- @Override
- public <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass) {
- return AnnotatedElements.getAnnotationsByType(this, annotationClass);
- }
-
- /**
- * {@inheritDoc}
- * @since 1.8
- * @hide 1.8
- */
- @Override
- public <T extends Annotation> Annotation getDeclaredAnnotation(Class<T> annotationClass) {
- return AnnotatedElements.getDeclaredAnnotation(this, annotationClass);
- }
}
diff --git a/ojluni/src/main/java/java/lang/reflect/AnnotatedElement.java b/ojluni/src/main/java/java/lang/reflect/AnnotatedElement.java
index b67b801..dc24483 100755
--- a/ojluni/src/main/java/java/lang/reflect/AnnotatedElement.java
+++ b/ojluni/src/main/java/java/lang/reflect/AnnotatedElement.java
@@ -1,5 +1,4 @@
/*
- * Copyright (C) 2016 The Android Open Source Project
* Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -27,7 +26,6 @@
package java.lang.reflect;
import java.lang.annotation.Annotation;
-// import libcore.reflect.AnnotatedElements;
/**
* Represents an annotated element of the program currently running in this
@@ -73,8 +71,7 @@
* @throws NullPointerException if the given annotation class is null
* @since 1.5
*/
- /*default*/ boolean isAnnotationPresent(Class<? extends Annotation> annotationClass);
- // { return getAnnotation(annotationClass) != null; }
+ boolean isAnnotationPresent(Class<? extends Annotation> annotationClass);
/**
* Returns this element's annotation for the specified type if
@@ -112,34 +109,4 @@
* @since 1.5
*/
Annotation[] getDeclaredAnnotations();
-
- /**
- * Returns a directly-present annotation on {@code this} element, whose class is
- * {@code annotationClass}, or {@code null} if nothing was found.
- *
- * @since 1.8
- * @hide 1.8
- */
- /*default*/ <T extends Annotation> Annotation getDeclaredAnnotation(Class<T> annotationClass);
- // { return AnnotatedElements.getDeclaredAnnotation(this, annotationClass); }
-
- /**
- * Returns a directly or indirectly present list of annotations on {@code this} element,
- * whose class is {@code annotationClass}, or an empty array if nothing was found.
- *
- * @since 1.8
- * @hide 1.8
- */
- /*default*/ <T extends Annotation> T[] getDeclaredAnnotationsByType(Class<T> annotationClass);
- // { return AnnotatedElements.getDeclaredAnnotationsByType(this, annotationClass); }
-
- /**
- * Returns an associated list of annotations on {@code this} element,
- * whose class is {@code annotationClass}, or an empty array if nothing was found.
- *
- * @since 1.8
- * @hide 1.8
- */
- /*default*/ <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass);
- // { return AnnotatedElements.getAnnotationsByType(this, annotationClass); }
}