1.1 --- a/emul/src/main/java/java/lang/reflect/Field.java Tue Dec 04 13:29:17 2012 +0100
1.2 +++ b/emul/src/main/java/java/lang/reflect/Field.java Tue Dec 04 14:31:11 2012 +0100
1.3 @@ -25,15 +25,7 @@
1.4
1.5 package java.lang.reflect;
1.6
1.7 -import sun.reflect.FieldAccessor;
1.8 -import sun.reflect.Reflection;
1.9 -import sun.reflect.generics.repository.FieldRepository;
1.10 -import sun.reflect.generics.factory.CoreReflectionFactory;
1.11 -import sun.reflect.generics.factory.GenericsFactory;
1.12 -import sun.reflect.generics.scope.ClassScope;
1.13 import java.lang.annotation.Annotation;
1.14 -import java.util.Map;
1.15 -import sun.reflect.annotation.AnnotationParser;
1.16
1.17
1.18 /**
1.19 @@ -67,13 +59,7 @@
1.20 private int modifiers;
1.21 // Generics and annotations support
1.22 private transient String signature;
1.23 - // generic info repository; lazily initialized
1.24 - private transient FieldRepository genericInfo;
1.25 private byte[] annotations;
1.26 - // Cached field accessor created without override
1.27 - private FieldAccessor fieldAccessor;
1.28 - // Cached field accessor created with override
1.29 - private FieldAccessor overrideFieldAccessor;
1.30 // For sharing of FieldAccessors. This branching structure is
1.31 // currently only two levels deep (i.e., one root Field and
1.32 // potentially many Field objects pointing to it.)
1.33 @@ -83,24 +69,6 @@
1.34
1.35 private String getGenericSignature() {return signature;}
1.36
1.37 - // Accessor for factory
1.38 - private GenericsFactory getFactory() {
1.39 - Class<?> c = getDeclaringClass();
1.40 - // create scope and factory
1.41 - return CoreReflectionFactory.make(c, ClassScope.make(c));
1.42 - }
1.43 -
1.44 - // Accessor for generic info repository
1.45 - private FieldRepository getGenericInfo() {
1.46 - // lazily initialize repository if necessary
1.47 - if (genericInfo == null) {
1.48 - // create and cache generic info repository
1.49 - genericInfo = FieldRepository.make(getGenericSignature(),
1.50 - getFactory());
1.51 - }
1.52 - return genericInfo; //return cached repository
1.53 - }
1.54 -
1.55
1.56 /**
1.57 * Package-private constructor used by ReflectAccess to enable
1.58 @@ -139,9 +107,6 @@
1.59 // objects.)
1.60 Field res = new Field(clazz, name, type, modifiers, slot, signature, annotations);
1.61 res.root = this;
1.62 - // Might as well eagerly propagate this if already present
1.63 - res.fieldAccessor = fieldAccessor;
1.64 - res.overrideFieldAccessor = overrideFieldAccessor;
1.65 return res;
1.66 }
1.67
1.68 @@ -232,10 +197,7 @@
1.69 * @since 1.5
1.70 */
1.71 public Type getGenericType() {
1.72 - if (getGenericSignature() != null)
1.73 - return getGenericInfo().getGenericType();
1.74 - else
1.75 - return getType();
1.76 + throw new UnsupportedOperationException();
1.77 }
1.78
1.79
1.80 @@ -924,65 +886,28 @@
1.81 private FieldAccessor getFieldAccessor(Object obj)
1.82 throws IllegalAccessException
1.83 {
1.84 - doSecurityCheck(obj);
1.85 - boolean ov = override;
1.86 - FieldAccessor a = (ov)? overrideFieldAccessor : fieldAccessor;
1.87 - return (a != null)? a : acquireFieldAccessor(ov);
1.88 + throw new SecurityException();
1.89 }
1.90 -
1.91 - // NOTE that there is no synchronization used here. It is correct
1.92 - // (though not efficient) to generate more than one FieldAccessor
1.93 - // for a given Field. However, avoiding synchronization will
1.94 - // probably make the implementation more scalable.
1.95 - private FieldAccessor acquireFieldAccessor(boolean overrideFinalCheck) {
1.96 - // First check to see if one has been created yet, and take it
1.97 - // if so
1.98 - FieldAccessor tmp = null;
1.99 - if (root != null) tmp = root.getFieldAccessor(overrideFinalCheck);
1.100 - if (tmp != null) {
1.101 - if (overrideFinalCheck)
1.102 - overrideFieldAccessor = tmp;
1.103 - else
1.104 - fieldAccessor = tmp;
1.105 - } else {
1.106 - // Otherwise fabricate one and propagate it up to the root
1.107 - tmp = reflectionFactory.newFieldAccessor(this, overrideFinalCheck);
1.108 - setFieldAccessor(tmp, overrideFinalCheck);
1.109 - }
1.110 -
1.111 - return tmp;
1.112 - }
1.113 -
1.114 - // Returns FieldAccessor for this Field object, not looking up
1.115 - // the chain to the root
1.116 - private FieldAccessor getFieldAccessor(boolean overrideFinalCheck) {
1.117 - return (overrideFinalCheck)? overrideFieldAccessor : fieldAccessor;
1.118 - }
1.119 -
1.120 - // Sets the FieldAccessor for this Field object and
1.121 - // (recursively) its root
1.122 - private void setFieldAccessor(FieldAccessor accessor, boolean overrideFinalCheck) {
1.123 - if (overrideFinalCheck)
1.124 - overrideFieldAccessor = accessor;
1.125 - else
1.126 - fieldAccessor = accessor;
1.127 - // Propagate up
1.128 - if (root != null) {
1.129 - root.setFieldAccessor(accessor, overrideFinalCheck);
1.130 - }
1.131 - }
1.132 -
1.133 - // NOTE: be very careful if you change the stack depth of this
1.134 - // routine. The depth of the "getCallerClass" call is hardwired so
1.135 - // that the compiler can have an easier time if this gets inlined.
1.136 - private void doSecurityCheck(Object obj) throws IllegalAccessException {
1.137 - if (!override) {
1.138 - if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
1.139 - Class<?> caller = Reflection.getCallerClass(4);
1.140 -
1.141 - checkAccess(caller, clazz, obj, modifiers);
1.142 - }
1.143 - }
1.144 +
1.145 + private static abstract class FieldAccessor {
1.146 + abstract void setShort(Object obj, short s);
1.147 + abstract void setInt(Object obj, int i);
1.148 + abstract void setChar(Object obj, char c);
1.149 + abstract void setByte(Object obj, byte b);
1.150 + abstract void setBoolean(Object obj, boolean z);
1.151 + abstract void set(Object obj, Object value);
1.152 + abstract double getDouble(Object obj);
1.153 + abstract void setLong(Object obj, long l);
1.154 + abstract void setFloat(Object obj, float f);
1.155 + abstract void setDouble(Object obj, double d);
1.156 + abstract long getLong(Object obj);
1.157 + abstract int getInt(Object obj);
1.158 + abstract short getShort(Object obj);
1.159 + abstract char getChar(Object obj);
1.160 + abstract byte getByte(Object obj);
1.161 + abstract boolean getBoolean(Object obj);
1.162 + abstract Object get(Object obj);
1.163 + abstract float getFloat(Object obj);
1.164 }
1.165
1.166 /*
1.167 @@ -1016,25 +941,13 @@
1.168 if (annotationClass == null)
1.169 throw new NullPointerException();
1.170
1.171 - return (T) declaredAnnotations().get(annotationClass);
1.172 + throw new UnsupportedOperationException();
1.173 }
1.174
1.175 /**
1.176 * @since 1.5
1.177 */
1.178 public Annotation[] getDeclaredAnnotations() {
1.179 - return AnnotationParser.toArray(declaredAnnotations());
1.180 - }
1.181 -
1.182 - private transient Map<Class<? extends Annotation>, Annotation> declaredAnnotations;
1.183 -
1.184 - private synchronized Map<Class<? extends Annotation>, Annotation> declaredAnnotations() {
1.185 - if (declaredAnnotations == null) {
1.186 - declaredAnnotations = AnnotationParser.parseAnnotations(
1.187 - annotations, sun.misc.SharedSecrets.getJavaLangAccess().
1.188 - getConstantPool(getDeclaringClass()),
1.189 - getDeclaringClass());
1.190 - }
1.191 - return declaredAnnotations;
1.192 + throw new UnsupportedOperationException();
1.193 }
1.194 }