1 /*
  2  * Copyright (c) 2001, 2023, Oracle and/or its affiliates. All rights reserved.
  3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  4  *
  5  * This code is free software; you can redistribute it and/or modify it
  6  * under the terms of the GNU General Public License version 2 only, as
  7  * published by the Free Software Foundation.  Oracle designates this
  8  * particular file as subject to the "Classpath" exception as provided
  9  * by Oracle in the LICENSE file that accompanied this code.
 10  *
 11  * This code is distributed in the hope that it will be useful, but WITHOUT
 12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 14  * version 2 for more details (a copy is included in the LICENSE file that
 15  * accompanied this code).
 16  *
 17  * You should have received a copy of the GNU General Public License version
 18  * 2 along with this work; if not, write to the Free Software Foundation,
 19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 20  *
 21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 22  * or visit www.oracle.com if you need additional information or have any
 23  * questions.
 24  */
 25 
 26 package java.lang.reflect;
 27 
 28 import jdk.internal.reflect.MethodAccessor;
 29 import jdk.internal.reflect.ConstructorAccessor;
 30 
 31 /** Package-private class implementing the
 32     jdk.internal.access.JavaLangReflectAccess interface, allowing the java.lang
 33     package to instantiate objects in this package. */
 34 
 35 class ReflectAccess implements jdk.internal.access.JavaLangReflectAccess {
 36     public <T> Constructor<T> newConstructor(Class<T> declaringClass,
 37                                              Class<?>[] parameterTypes,
 38                                              Class<?>[] checkedExceptions,
 39                                              int modifiers,
 40                                              int slot,
 41                                              String signature,
 42                                              byte[] annotations,
 43                                              byte[] parameterAnnotations)
 44     {
 45         return new Constructor<>(declaringClass,
 46                                   parameterTypes,
 47                                   checkedExceptions,
 48                                   modifiers,
 49                                   slot,
 50                                   signature,
 51                                   annotations,
 52                                   parameterAnnotations);
 53     }
 54 
 55     public MethodAccessor getMethodAccessor(Method m) {
 56         return m.getMethodAccessor();
 57     }
 58 
 59     public void setMethodAccessor(Method m, MethodAccessor accessor) {
 60         m.setMethodAccessor(accessor);
 61     }
 62 
 63     public ConstructorAccessor getConstructorAccessor(Constructor<?> c) {
 64         return c.getConstructorAccessor();
 65     }
 66 
 67     public void setConstructorAccessor(Constructor<?> c,
 68                                        ConstructorAccessor accessor)
 69     {
 70         c.setConstructorAccessor(accessor);
 71     }
 72 
 73     public int getConstructorSlot(Constructor<?> c) {
 74         return c.getSlot();
 75     }
 76 
 77     public String getConstructorSignature(Constructor<?> c) {
 78         return c.getSignature();
 79     }
 80 
 81     public byte[] getConstructorAnnotations(Constructor<?> c) {
 82         return c.getRawAnnotations();
 83     }
 84 
 85     public byte[] getConstructorParameterAnnotations(Constructor<?> c) {
 86         return c.getRawParameterAnnotations();
 87     }
 88 
 89     public byte[] getExecutableTypeAnnotationBytes(Executable ex) {
 90         return ex.getTypeAnnotationBytes();
 91     }
 92 
 93     public Class<?>[] getExecutableSharedParameterTypes(Executable ex) {
 94         return ex.getSharedParameterTypes();
 95     }
 96 
 97     public Class<?>[] getExecutableSharedExceptionTypes(Executable ex) {
 98         return ex.getSharedExceptionTypes();
 99     }
100 
101     //
102     // Copying routines, needed to quickly fabricate new Field,
103     // Method, and Constructor objects from templates
104     //
105     public Method      copyMethod(Method arg) {
106         return arg.copy();
107     }
108     public Method      leafCopyMethod(Method arg) {
109         return arg.leafCopy();
110     }
111 
112     public Field       copyField(Field arg) {
113         return arg.copy();
114     }
115 
116     public <T> Constructor<T> copyConstructor(Constructor<T> arg) {
117         return arg.copy();
118     }
119 
120     @SuppressWarnings("unchecked")
121     public <T extends AccessibleObject> T getRoot(T obj) {
122         return (T) obj.getRoot();
123     }
124 
125     public boolean isTrustedFinalField(Field f) {
126         return f.isTrustedFinal();
127     }
128 
129     public <T> T newInstance(Constructor<T> ctor, Object[] args, Class<?> caller)
130         throws IllegalAccessException, InstantiationException, InvocationTargetException
131     {
132         return ctor.newInstanceWithCaller(args, true, caller);
133     }
134 }