Mercurial > hg > Members > kono > jpf-core
diff src/classes/sun/reflect/annotation/AnnotationType.java @ 0:61d41facf527
initial v8 import (history reset)
author | Peter Mehlitz <Peter.C.Mehlitz@nasa.gov> |
---|---|
date | Fri, 23 Jan 2015 10:14:01 -0800 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/classes/sun/reflect/annotation/AnnotationType.java Fri Jan 23 10:14:01 2015 -0800 @@ -0,0 +1,143 @@ +/* + * Copyright (C) 2014, United States Government, as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All rights reserved. + * + * The Java Pathfinder core (jpf-core) platform is 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 sun.reflect.annotation; + +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +import sun.misc.SharedSecrets; + +/** + * this is a placeholder for a Java 6 class, which we only have here to + * support both Java 1.5 and 6 with the same set of env/ classes + * + * this is Java only, so it's a drag we have to add this, but since it is outside + * java.* and doesn't refer to Java 6 stuff outside the sun.misc.SharedSecrets + * we bite the bullet and add it (for now) + * + * <2do> THIS IS GOING AWAY AS SOON AS WE OFFICIALLY SWITCH TO JAVA 6 + */ +public class AnnotationType { + + private RetentionPolicy retention = RetentionPolicy.RUNTIME; + private boolean inherited = false; + + // caches + private final Map<String, Class<?>> memberTypes = new HashMap<String, Class<?>>(); + private final Map<String, Object> memberDefaults = new HashMap<String, Object>(); + private final Map<String, Method> members = new HashMap<String, Method>(); + + + public static synchronized AnnotationType getInstance (Class<?> annotationClass) { + AnnotationType at = SharedSecrets.getJavaLangAccess().getAnnotationType(annotationClass); + if (at == null) { + at = new AnnotationType(annotationClass); + } + return at; + } + + private AnnotationType(final Class<?> annoCls) { + if (!annoCls.isAnnotation()) { + throw new IllegalArgumentException("Not an annotation type"); + } + + Method[] methods = annoCls.getDeclaredMethods(); + + for (Method m : methods) { + if (m.getParameterTypes().length == 0) { + // cache name -> method assoc + String mname = m.getName(); + members.put(mname, m); + + // cache member type + Class<?> type = m.getReturnType(); + memberTypes.put(mname, invocationHandlerReturnType(type)); + + // cache member default val (if any) + Object val = m.getDefaultValue(); + if (val != null) { + memberDefaults.put(mname, val); + } + } else { + // probably an exception + } + } + + if ((annoCls != Retention.class) && (annoCls != Inherited.class)) { // don't get recursive + inherited = annoCls.isAnnotationPresent(Inherited.class); + + Retention r = annoCls.getAnnotation(Retention.class); + if (r == null) { + retention = RetentionPolicy.CLASS; + } else { + retention = r.value(); + } + } + + SharedSecrets.getJavaLangAccess().setAnnotationType(annoCls, this); + } + + public static Class<?> invocationHandlerReturnType (Class<?> type) { + // return box types for builtins + if (type == boolean.class) { + return Boolean.class; + } else if (type == byte.class) { + return Byte.class; + } else if (type == char.class) { + return Character.class; + } else if (type == short.class) { + return Short.class; + } else if (type == int.class) { + return Integer.class; + } else if (type == long.class) { + return Long.class; + } else if (type == float.class) { + return Float.class; + } else if (type == double.class) { + return Double.class; + } else { + return type; + } + } + + public Map<String, Class<?>> memberTypes() { + return memberTypes; + } + + public Map<String, Method> members() { + return members; + } + + public Map<String, Object> memberDefaults() { + return memberDefaults; + } + + public RetentionPolicy retention() { + return retention; + } + + public boolean isInherited() { + return inherited; + } + +}