1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
   2 <HTML>
   3 <HEAD>
   4 <!--
   5 
   6  Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved.
   7  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   8 
   9  This code is free software; you can redistribute it and/or modify it
  10  under the terms of the GNU General Public License version 2 only, as
  11  published by the Free Software Foundation.  Oracle designates this
  12  particular file as subject to the "Classpath" exception as provided
  13  by Oracle in the LICENSE file that accompanied this code.
  14 
  15  This code is distributed in the hope that it will be useful, but WITHOUT
  16  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  17  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  18  version 2 for more details (a copy is included in the LICENSE file that
  19  accompanied this code).
  20 
  21  You should have received a copy of the GNU General Public License version
  22  2 along with this work; if not, write to the Free Software Foundation,
  23  Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  24 
  25  Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  26  or visit www.oracle.com if you need additional information or have any
  27  questions.
  28  
  29 -->
  30 </HEAD>
  31 <BODY BGCOLOR="white">
  32 <P>
  33 
  34 <B> Licensee impact of JDK 1.4 reflection changes </B>
  35 
  36 </P>
  37 <P>
  38 
  39 Sun's JDK 1.4 contains a new implementation of java.lang.reflect which
  40 offers substantially higher performance than previous JDKs' native
  41 code. Licensees can at their discretion port these changes. There are
  42 no public API or documentation changes associated with the new
  43 reflection implementation aside from a few minor clarifications in the
  44 specifications of Method.invoke(), Constructor.newInstance(), and a
  45 few methods in java.lang.reflect.Field.
  46 
  47 </P>
  48 <P>
  49 
  50 The bulk of the new implementation is Java programming language code
  51 which generates bytecodes, and is therefore portable. If licensees
  52 desire to port it, the following JVM changes are required:
  53 
  54 <OL>
  55 <LI> The following four new JVM entry points must be added:
  56 
  57  <UL>
  58  <LI> JVM_GetClassDeclaredConstructors
  59  <LI> JVM_GetClassDeclaredFields
  60  <LI> JVM_GetClassDeclaredMethods
  61  <LI> JVM_GetClassAccessFlags
  62  </UL>
  63 
  64 The first three return the declared constructors, fields, and methods
  65 for a given class, with an option to return only the public ones. They
  66 are similar in functionality to the earlier GetClassConstructors,
  67 GetClassFields, and GetClassMethods.  JVM_GetClassDeclaredFields and
  68 JVM_GetClassDeclaredMethods must intern the Strings for the names of
  69 the Field and Method objects returned. The fouth returns the access
  70 flags for a given class as marked in the class file, as opposed to in
  71 the InnerClasses attribute if the class is an inner class, and
  72 therefore differs from JVM_GetClassModifiers for inner classes (most
  73 importantly, protected inner classes; see 4471811.)
  74 
  75 <LI> The JVM's link resolver must be modified to allow all field and
  76 method references from subclasses of sun.reflect.MagicAccessorImpl to
  77 any other class (even to private members of other classes) to
  78 succeed. This allows setAccessible() and its associated checks to be
  79 implemented in Java.
  80 
  81 <LI> The code which calls the verifier must skip verification for all
  82 subclasses of sun.reflect.MagicAccessorImpl. (It was originally
  83 intended that only a subset of the stub classes used for serialization
  84 would not pass the verifier, specifically, those subclassing
  85 SerializationConstructorAccessorImpl; see 4486457 for a case where
  86 this does not work.)
  87 
  88 <LI> The stack walker for security checks must be modified to skip not
  89 only all Method.invoke() frames, but also any frames for which the
  90 class is a subclass of sun.reflect.MethodAccessorImpl.
  91 
  92 <LI> The JVM entry points JVM_InvokeMethod and
  93 JVM_NewInstanceFromConstructor are currently still used because the
  94 first invocation of the bytecode-based reflection is currently slower
  95 than the original native code. The security checks they perform can,
  96 however, be disabled, as they are now performed by Java programming
  97 language code.
  98 
  99 </OL>
 100 
 101 </P>
 102 <P>
 103 
 104 The following changes were discovered to be necessary for backward
 105 compatibility with certain applications (see bug 4474172):
 106 
 107 <OL>
 108 
 109 <LI> The existing JVM entry point JVM_LatestUserDefinedLoader
 110 (typically used in applications which rely on the 1.1 security
 111 framework) must skip reflection-related frames in its stack walk:
 112 specifically all frames associated with subclasses of
 113 sun.reflect.MethodAccessorImpl and
 114 sun.reflect.ConstructorAccessorImpl.
 115 
 116 <LI> The new reflection implementation can cause class loading to
 117 occur in previously-unexpected places (namely during reflective
 118 calls).  This can cause class loaders which contain subtle bugs to
 119 break.  In general it is not possible to guarantee complete backward
 120 bug compatibility, but one kind of bug has been observed more than
 121 once: the inability of a user-defined loader to handle delegation to
 122 it for a class it has already loaded. The new reflection
 123 implementation is predicated on delegation working properly, as it
 124 loads stub classes into newly-fabricated class loaders of type
 125 sun.reflect.DelegatingClassLoader, one stub class per loader, to allow
 126 unloading of the stub classes to occur more quickly. To handle this
 127 kind of bug, the JVM's internal class lookup mechanism must be
 128 slightly modified to check for instances of
 129 sun.reflect.DelegatingClassLoader as the incoming class loader and
 130 silently traverse the "parent" field once for such loaders before
 131 entering the bulk of the resolution code. This avoids an upcall to
 132 Java programming language code which certain loaders can not handle.
 133 
 134 </OL>
 135 
 136 </P>
 137 <P>
 138 
 139 The following JVM entry points may be deleted:
 140 
 141 <UL>
 142 <LI> JVM_GetClassFields
 143 <LI> JVM_GetClassMethods
 144 <LI> JVM_GetClassConstructors
 145 <LI> JVM_GetClassField
 146 <LI> JVM_GetClassMethod
 147 <LI> JVM_GetClassConstructor
 148 <LI> JVM_NewInstance
 149 <LI> JVM_GetField
 150 <LI> JVM_GetPrimitiveField
 151 <LI> JVM_SetField
 152 <LI> JVM_SetPrimitiveField
 153 </UL>
 154 
 155 </P>
 156 <P>
 157 
 158 To keep using the previous reflection implementation, licensees should
 159 not take changes from Sun's JDK 1.4 relating specifically to the
 160 implementation of reflection in the following classes/methods and
 161 any associated native code:
 162 
 163 <UL>
 164 <LI> java.lang.Class.newInstance0
 165 <LI> java.lang.Class.getClassLoader0
 166 <LI> java.lang.Class.getFields
 167 <LI> java.lang.Class.getMethods
 168 <LI> java.lang.Class.getDeclaredFields
 169 <LI> java.lang.Class.getDeclaredMethods
 170 <LI> java.lang.Class.getFields0
 171 <LI> java.lang.Class.getMethods0
 172 <LI> java.lang.Class.getConstructors0
 173 <LI> java.lang.Class.getField0
 174 <LI> java.lang.Class.getMethod0
 175 <LI> java.lang.Class.getConstructor0
 176 <LI> java.lang.ClassLoader.getCallerClassLoader
 177 <LI> java.lang.System.getCallerClass
 178 <LI> java.lang.reflect.AccessibleObject
 179 <LI> java.lang.reflect.Constructor
 180 <LI> java.lang.reflect.Field
 181 <LI> java.lang.reflect.Method
 182 <LI> java.lang.reflect.Modifier
 183 <LI> sun.misc.ClassReflector
 184 </UL>
 185 
 186 </P>
 187 </HTML>