You've already forked linux-packaging-mono
Imported Upstream version 4.2.1.36
Former-commit-id: fb75898888a02f4d3a74cf0a5b841681bc4c7fa8
This commit is contained in:
committed by
Jo Shields
parent
9668de7cb8
commit
dd547c45d4
154
external/ikvm/openjdk/java/lang/reflect/Field.java
vendored
154
external/ikvm/openjdk/java/lang/reflect/Field.java
vendored
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1996, 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
|
||||
@ -34,8 +34,11 @@ import sun.reflect.generics.factory.GenericsFactory;
|
||||
import sun.reflect.generics.scope.ClassScope;
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import sun.reflect.annotation.AnnotationParser;
|
||||
|
||||
import sun.reflect.annotation.AnnotationSupport;
|
||||
import sun.reflect.annotation.TypeAnnotation;
|
||||
import sun.reflect.annotation.TypeAnnotationParser;
|
||||
|
||||
/**
|
||||
* A {@code Field} provides information about, and dynamic access to, a
|
||||
@ -77,6 +80,9 @@ class Field extends AccessibleObject implements Member {
|
||||
// For sharing of FieldAccessors. This branching structure is
|
||||
// currently only two levels deep (i.e., one root Field and
|
||||
// potentially many Field objects pointing to it.)
|
||||
//
|
||||
// If this branching structure would ever contain cycles, deadlocks can
|
||||
// occur in annotation code.
|
||||
private Field root;
|
||||
|
||||
// Generics infrastructure
|
||||
@ -136,11 +142,15 @@ class Field extends AccessibleObject implements Member {
|
||||
// which implicitly requires that new java.lang.reflect
|
||||
// objects be fabricated for each reflective call on Class
|
||||
// objects.)
|
||||
if (this.root != null)
|
||||
throw new IllegalArgumentException("Can not copy a non-root Field");
|
||||
|
||||
Field res = new Field(clazz, name, type, modifiers, slot, signature, null);
|
||||
res.root = this;
|
||||
// Might as well eagerly propagate this if already present
|
||||
res.fieldAccessor = fieldAccessor;
|
||||
res.overrideFieldAccessor = overrideFieldAccessor;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -280,12 +290,15 @@ class Field extends AccessibleObject implements Member {
|
||||
* {@code protected} or {@code private} first, and then other
|
||||
* modifiers in the following order: {@code static}, {@code final},
|
||||
* {@code transient}, {@code volatile}.
|
||||
*
|
||||
* @return a string describing this {@code Field}
|
||||
* @jls 8.3.1 Field Modifiers
|
||||
*/
|
||||
public String toString() {
|
||||
int mod = getModifiers();
|
||||
return (((mod == 0) ? "" : (Modifier.toString(mod) + " "))
|
||||
+ getTypeName(getType()) + " "
|
||||
+ getTypeName(getDeclaringClass()) + "."
|
||||
+ getType().getTypeName() + " "
|
||||
+ getDeclaringClass().getTypeName() + "."
|
||||
+ getName());
|
||||
}
|
||||
|
||||
@ -307,14 +320,14 @@ class Field extends AccessibleObject implements Member {
|
||||
* its generic type
|
||||
*
|
||||
* @since 1.5
|
||||
* @jls 8.3.1 Field Modifiers
|
||||
*/
|
||||
public String toGenericString() {
|
||||
int mod = getModifiers();
|
||||
Type fieldType = getGenericType();
|
||||
return (((mod == 0) ? "" : (Modifier.toString(mod) + " "))
|
||||
+ ((fieldType instanceof Class) ?
|
||||
getTypeName((Class)fieldType): fieldType.toString())+ " "
|
||||
+ getTypeName(getDeclaringClass()) + "."
|
||||
+ fieldType.getTypeName() + " "
|
||||
+ getDeclaringClass().getTypeName() + "."
|
||||
+ getName());
|
||||
}
|
||||
|
||||
@ -371,7 +384,8 @@ class Field extends AccessibleObject implements Member {
|
||||
{
|
||||
if (!override) {
|
||||
if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
|
||||
checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
|
||||
Class<?> caller = Reflection.getCallerClass();
|
||||
checkAccess(caller, clazz, obj, modifiers);
|
||||
}
|
||||
}
|
||||
return getFieldAccessor(obj).get(obj);
|
||||
@ -405,7 +419,8 @@ class Field extends AccessibleObject implements Member {
|
||||
{
|
||||
if (!override) {
|
||||
if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
|
||||
checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
|
||||
Class<?> caller = Reflection.getCallerClass();
|
||||
checkAccess(caller, clazz, obj, modifiers);
|
||||
}
|
||||
}
|
||||
return getFieldAccessor(obj).getBoolean(obj);
|
||||
@ -439,7 +454,8 @@ class Field extends AccessibleObject implements Member {
|
||||
{
|
||||
if (!override) {
|
||||
if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
|
||||
checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
|
||||
Class<?> caller = Reflection.getCallerClass();
|
||||
checkAccess(caller, clazz, obj, modifiers);
|
||||
}
|
||||
}
|
||||
return getFieldAccessor(obj).getByte(obj);
|
||||
@ -475,7 +491,8 @@ class Field extends AccessibleObject implements Member {
|
||||
{
|
||||
if (!override) {
|
||||
if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
|
||||
checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
|
||||
Class<?> caller = Reflection.getCallerClass();
|
||||
checkAccess(caller, clazz, obj, modifiers);
|
||||
}
|
||||
}
|
||||
return getFieldAccessor(obj).getChar(obj);
|
||||
@ -511,7 +528,8 @@ class Field extends AccessibleObject implements Member {
|
||||
{
|
||||
if (!override) {
|
||||
if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
|
||||
checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
|
||||
Class<?> caller = Reflection.getCallerClass();
|
||||
checkAccess(caller, clazz, obj, modifiers);
|
||||
}
|
||||
}
|
||||
return getFieldAccessor(obj).getShort(obj);
|
||||
@ -547,7 +565,8 @@ class Field extends AccessibleObject implements Member {
|
||||
{
|
||||
if (!override) {
|
||||
if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
|
||||
checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
|
||||
Class<?> caller = Reflection.getCallerClass();
|
||||
checkAccess(caller, clazz, obj, modifiers);
|
||||
}
|
||||
}
|
||||
return getFieldAccessor(obj).getInt(obj);
|
||||
@ -583,7 +602,8 @@ class Field extends AccessibleObject implements Member {
|
||||
{
|
||||
if (!override) {
|
||||
if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
|
||||
checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
|
||||
Class<?> caller = Reflection.getCallerClass();
|
||||
checkAccess(caller, clazz, obj, modifiers);
|
||||
}
|
||||
}
|
||||
return getFieldAccessor(obj).getLong(obj);
|
||||
@ -619,7 +639,8 @@ class Field extends AccessibleObject implements Member {
|
||||
{
|
||||
if (!override) {
|
||||
if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
|
||||
checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
|
||||
Class<?> caller = Reflection.getCallerClass();
|
||||
checkAccess(caller, clazz, obj, modifiers);
|
||||
}
|
||||
}
|
||||
return getFieldAccessor(obj).getFloat(obj);
|
||||
@ -655,7 +676,8 @@ class Field extends AccessibleObject implements Member {
|
||||
{
|
||||
if (!override) {
|
||||
if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
|
||||
checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
|
||||
Class<?> caller = Reflection.getCallerClass();
|
||||
checkAccess(caller, clazz, obj, modifiers);
|
||||
}
|
||||
}
|
||||
return getFieldAccessor(obj).getDouble(obj);
|
||||
@ -733,7 +755,8 @@ class Field extends AccessibleObject implements Member {
|
||||
{
|
||||
if (!override) {
|
||||
if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
|
||||
checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
|
||||
Class<?> caller = Reflection.getCallerClass();
|
||||
checkAccess(caller, clazz, obj, modifiers);
|
||||
}
|
||||
}
|
||||
getFieldAccessor(obj).set(obj, value);
|
||||
@ -769,7 +792,8 @@ class Field extends AccessibleObject implements Member {
|
||||
{
|
||||
if (!override) {
|
||||
if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
|
||||
checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
|
||||
Class<?> caller = Reflection.getCallerClass();
|
||||
checkAccess(caller, clazz, obj, modifiers);
|
||||
}
|
||||
}
|
||||
getFieldAccessor(obj).setBoolean(obj, z);
|
||||
@ -805,7 +829,8 @@ class Field extends AccessibleObject implements Member {
|
||||
{
|
||||
if (!override) {
|
||||
if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
|
||||
checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
|
||||
Class<?> caller = Reflection.getCallerClass();
|
||||
checkAccess(caller, clazz, obj, modifiers);
|
||||
}
|
||||
}
|
||||
getFieldAccessor(obj).setByte(obj, b);
|
||||
@ -841,7 +866,8 @@ class Field extends AccessibleObject implements Member {
|
||||
{
|
||||
if (!override) {
|
||||
if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
|
||||
checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
|
||||
Class<?> caller = Reflection.getCallerClass();
|
||||
checkAccess(caller, clazz, obj, modifiers);
|
||||
}
|
||||
}
|
||||
getFieldAccessor(obj).setChar(obj, c);
|
||||
@ -877,7 +903,8 @@ class Field extends AccessibleObject implements Member {
|
||||
{
|
||||
if (!override) {
|
||||
if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
|
||||
checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
|
||||
Class<?> caller = Reflection.getCallerClass();
|
||||
checkAccess(caller, clazz, obj, modifiers);
|
||||
}
|
||||
}
|
||||
getFieldAccessor(obj).setShort(obj, s);
|
||||
@ -913,7 +940,8 @@ class Field extends AccessibleObject implements Member {
|
||||
{
|
||||
if (!override) {
|
||||
if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
|
||||
checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
|
||||
Class<?> caller = Reflection.getCallerClass();
|
||||
checkAccess(caller, clazz, obj, modifiers);
|
||||
}
|
||||
}
|
||||
getFieldAccessor(obj).setInt(obj, i);
|
||||
@ -949,7 +977,8 @@ class Field extends AccessibleObject implements Member {
|
||||
{
|
||||
if (!override) {
|
||||
if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
|
||||
checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
|
||||
Class<?> caller = Reflection.getCallerClass();
|
||||
checkAccess(caller, clazz, obj, modifiers);
|
||||
}
|
||||
}
|
||||
getFieldAccessor(obj).setLong(obj, l);
|
||||
@ -985,7 +1014,8 @@ class Field extends AccessibleObject implements Member {
|
||||
{
|
||||
if (!override) {
|
||||
if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
|
||||
checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
|
||||
Class<?> caller = Reflection.getCallerClass();
|
||||
checkAccess(caller, clazz, obj, modifiers);
|
||||
}
|
||||
}
|
||||
getFieldAccessor(obj).setFloat(obj, f);
|
||||
@ -1021,7 +1051,8 @@ class Field extends AccessibleObject implements Member {
|
||||
{
|
||||
if (!override) {
|
||||
if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
|
||||
checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
|
||||
Class<?> caller = Reflection.getCallerClass();
|
||||
checkAccess(caller, clazz, obj, modifiers);
|
||||
}
|
||||
}
|
||||
getFieldAccessor(obj).setDouble(obj, d);
|
||||
@ -1078,57 +1109,66 @@ class Field extends AccessibleObject implements Member {
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Utility routine to paper over array type names
|
||||
*/
|
||||
static String getTypeName(Class<?> type) {
|
||||
if (type.isArray()) {
|
||||
try {
|
||||
Class<?> cl = type;
|
||||
int dimensions = 0;
|
||||
while (cl.isArray()) {
|
||||
dimensions++;
|
||||
cl = cl.getComponentType();
|
||||
}
|
||||
StringBuffer sb = new StringBuffer();
|
||||
sb.append(cl.getName());
|
||||
for (int i = 0; i < dimensions; i++) {
|
||||
sb.append("[]");
|
||||
}
|
||||
return sb.toString();
|
||||
} catch (Throwable e) { /*FALLTHRU*/ }
|
||||
}
|
||||
return type.getName();
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws NullPointerException {@inheritDoc}
|
||||
* @since 1.5
|
||||
*/
|
||||
public <T extends Annotation> T getAnnotation(Class<T> annotationClass) {
|
||||
if (annotationClass == null)
|
||||
throw new NullPointerException();
|
||||
|
||||
return (T) declaredAnnotations().get(annotationClass);
|
||||
Objects.requireNonNull(annotationClass);
|
||||
return annotationClass.cast(declaredAnnotations().get(annotationClass));
|
||||
}
|
||||
|
||||
private static final Annotation[] EMPTY_ANNOTATION_ARRAY=new Annotation[0];
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
* @throws NullPointerException {@inheritDoc}
|
||||
* @since 1.8
|
||||
*/
|
||||
@Override
|
||||
public <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass) {
|
||||
Objects.requireNonNull(annotationClass);
|
||||
|
||||
return AnnotationSupport.getDirectlyAndIndirectlyPresent(declaredAnnotations(), annotationClass);
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 1.5
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public Annotation[] getDeclaredAnnotations() {
|
||||
return declaredAnnotations().values().toArray(EMPTY_ANNOTATION_ARRAY);
|
||||
return AnnotationParser.toArray(declaredAnnotations());
|
||||
}
|
||||
|
||||
private transient Map<Class<? extends Annotation>, Annotation> declaredAnnotations;
|
||||
|
||||
private synchronized Map<Class<? extends Annotation>, Annotation> declaredAnnotations() {
|
||||
if (declaredAnnotations == null) {
|
||||
declaredAnnotations = getDeclaredAnnotationsImpl();
|
||||
Field root = this.root;
|
||||
if (root != null) {
|
||||
declaredAnnotations = root.declaredAnnotations();
|
||||
} else {
|
||||
declaredAnnotations = getDeclaredAnnotationsImpl();
|
||||
}
|
||||
}
|
||||
return declaredAnnotations;
|
||||
}
|
||||
|
||||
|
||||
private native Map<Class<? extends Annotation>, Annotation> getDeclaredAnnotationsImpl();
|
||||
private native byte[] getTypeAnnotationBytes0();
|
||||
|
||||
/**
|
||||
* Returns an AnnotatedType object that represents the use of a type to specify
|
||||
* the declared type of the field represented by this Field.
|
||||
* @return an object representing the declared type of the field
|
||||
* represented by this Field
|
||||
*
|
||||
* @since 1.8
|
||||
*/
|
||||
public AnnotatedType getAnnotatedType() {
|
||||
return TypeAnnotationParser.buildAnnotatedType(getTypeAnnotationBytes0(),
|
||||
sun.misc.SharedSecrets.getJavaLangAccess().
|
||||
getConstantPool(getDeclaringClass()),
|
||||
this,
|
||||
getDeclaringClass(),
|
||||
getGenericType(),
|
||||
TypeAnnotation.TypeAnnotationTarget.FIELD);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user