src/hotspot/share/runtime/reflection.hpp
author iklam
Fri, 29 Nov 2019 14:11:50 -0800
changeset 59328 f280911d3427
parent 53244 9807daeb47c4
permissions -rw-r--r--
8230385: [cds] No message is logged when shared image cannot be used due to mismatched configuration Reviewed-by: stuefe, dholmes, ccheung
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 52216
diff changeset
     2
 * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 2332
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 2332
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 2332
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 52216
diff changeset
    25
#ifndef SHARE_RUNTIME_REFLECTION_HPP
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 52216
diff changeset
    26
#define SHARE_RUNTIME_REFLECTION_HPP
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    27
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    28
#include "oops/oop.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    29
#include "runtime/fieldDescriptor.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    30
#include "utilities/accessFlags.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    31
#include "utilities/growableArray.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    32
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
// Class Reflection contains utility methods needed for implementing the
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
// reflection api.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
// Used by functions in the JVM interface.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
// NOTE that in JDK 1.4 most of reflection is now implemented in Java
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
// using dynamic bytecode generation. The Array class has not yet been
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
// rewritten using bytecodes; if it were, most of the rest of this
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
// class could go away, as well as a few more entry points in jvm.cpp.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
class FieldStream;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
class Reflection: public AllStatic {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
  // Constants defined by java reflection api classes
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
  enum SomeConstants {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
    PUBLIC            = 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
    DECLARED          = 1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
    MEMBER_PUBLIC     = 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
    MEMBER_DECLARED   = 1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
    MAX_DIM           = 255
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
36508
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 34666
diff changeset
    56
  // Results returned by verify_class_access()
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 34666
diff changeset
    57
  enum VerifyClassAccessResults {
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 34666
diff changeset
    58
    ACCESS_OK = 0,
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 34666
diff changeset
    59
    MODULE_NOT_READABLE = 1,
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 34666
diff changeset
    60
    TYPE_NOT_EXPORTED = 2,
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 34666
diff changeset
    61
    OTHER_PROBLEM = 3
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 34666
diff changeset
    62
  };
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 34666
diff changeset
    63
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
  // Boxing. Returns boxed value of appropriate type. Throws IllegalArgumentException.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
  static oop box(jvalue* v, BasicType type, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
  // Unboxing. Returns type code and sets value.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
  static BasicType unbox_for_primitive(oop boxed_value, jvalue* value, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
  static BasicType unbox_for_regular_object(oop boxed_value, jvalue* value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
  // Widening of basic types. Throws IllegalArgumentException.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
  static void widen(jvalue* value, BasicType current_type, BasicType wide_type, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
  // Reflective array access. Returns type code. Throws ArrayIndexOutOfBoundsException.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
  static BasicType array_get(jvalue* value, arrayOop a, int index, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
  static void      array_set(jvalue* value, arrayOop a, int index, BasicType value_type, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
  // Object creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  static arrayOop reflect_new_array(oop element_mirror, jint length, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  static arrayOop reflect_new_multi_array(oop element_mirror, typeArrayOop dimensions, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  // Verification
36508
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 34666
diff changeset
    82
  static VerifyClassAccessResults verify_class_access(const Klass* current_class,
46262
83280d968b96 8174092: Remove array-related access checks from Reflection::verify_class_access()
hseigel
parents: 36508
diff changeset
    83
                                                      const InstanceKlass* new_class,
36508
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 34666
diff changeset
    84
                                                      bool classloader_only);
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 34666
diff changeset
    85
  // Return an error message specific to the specified Klass*'s and result.
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 34666
diff changeset
    86
  // This function must be called from within a block containing a ResourceMark.
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 34666
diff changeset
    87
  static char*    verify_class_access_msg(const Klass* current_class,
46262
83280d968b96 8174092: Remove array-related access checks from Reflection::verify_class_access()
hseigel
parents: 36508
diff changeset
    88
                                          const InstanceKlass* new_class,
36508
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 34666
diff changeset
    89
                                          const VerifyClassAccessResults result);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
50735
2f2af62dfac7 8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents: 47216
diff changeset
    91
  static bool     verify_member_access(const Klass* current_class,
2f2af62dfac7 8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents: 47216
diff changeset
    92
                                       const Klass* resolved_class,
2f2af62dfac7 8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents: 47216
diff changeset
    93
                                       const Klass* member_class,
2f2af62dfac7 8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents: 47216
diff changeset
    94
                                       AccessFlags access,
2f2af62dfac7 8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents: 47216
diff changeset
    95
                                       bool classloader_only,
2f2af62dfac7 8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents: 47216
diff changeset
    96
                                       bool protected_restriction,
2f2af62dfac7 8010319: Implementation of JEP 181: Nest-Based Access Control
dholmes
parents: 47216
diff changeset
    97
                                       TRAPS);
34666
1c7168ea0034 8140485: Class load and creation cleanup
mgronlun
parents: 33593
diff changeset
    98
  static bool     is_same_class_package(const Klass* class1, const Klass* class2);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  // inner class reflection
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 1
diff changeset
   101
  // raise an ICCE unless the required relationship can be proven to hold
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 1
diff changeset
   102
  // If inner_is_member, require the inner to be a member of the outer.
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 1
diff changeset
   103
  // If !inner_is_member, require the inner to be anonymous (a non-member).
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 1
diff changeset
   104
  // Caller is responsible for figuring out in advance which case must be true.
46329
53ccc37bda19 8155672: Remove instanceKlassHandles and KlassHandles
coleenp
parents: 46262
diff changeset
   105
  static void check_for_inner_class(const InstanceKlass* outer,
53ccc37bda19 8155672: Remove instanceKlassHandles and KlassHandles
coleenp
parents: 46262
diff changeset
   106
                                    const InstanceKlass* inner,
34666
1c7168ea0034 8140485: Class load and creation cleanup
mgronlun
parents: 33593
diff changeset
   107
                                    bool inner_is_member,
1c7168ea0034 8140485: Class load and creation cleanup
mgronlun
parents: 33593
diff changeset
   108
                                    TRAPS);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
  // Support for reflection based on dynamic bytecode generation (JDK 1.4)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  // Create a java.lang.reflect.Method object based on a method
33593
60764a78fa5c 8140274: methodHandles and constantPoolHandles should be passed as const references
coleenp
parents: 25057
diff changeset
   115
  static oop new_method(const methodHandle& method, bool for_constant_pool_access, TRAPS);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  // Create a java.lang.reflect.Constructor object based on a method
33593
60764a78fa5c 8140274: methodHandles and constantPoolHandles should be passed as const references
coleenp
parents: 25057
diff changeset
   117
  static oop new_constructor(const methodHandle& method, TRAPS);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  // Create a java.lang.reflect.Field object based on a field descriptor
24456
8c7933fa5a1f 8025580: Temporary flags: UseNewReflection and ReflectionWrapResolutionErrors
coleenp
parents: 22551
diff changeset
   119
  static oop new_field(fieldDescriptor* fd, TRAPS);
15102
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 13728
diff changeset
   120
  // Create a java.lang.reflect.Parameter object based on a
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 13728
diff changeset
   121
  // MethodParameterElement
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 13728
diff changeset
   122
  static oop new_parameter(Handle method, int index, Symbol* sym,
0a86564e5f61 8004728: Add hotspot support for parameter reflection
coleenp
parents: 13728
diff changeset
   123
                           int flags, TRAPS);
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22234
diff changeset
   124
  // Method invocation through java.lang.reflect.Method
34666
1c7168ea0034 8140485: Class load and creation cleanup
mgronlun
parents: 33593
diff changeset
   125
  static oop      invoke_method(oop method_mirror,
1c7168ea0034 8140485: Class load and creation cleanup
mgronlun
parents: 33593
diff changeset
   126
                               Handle receiver,
1c7168ea0034 8140485: Class load and creation cleanup
mgronlun
parents: 33593
diff changeset
   127
                               objArrayHandle args,
1c7168ea0034 8140485: Class load and creation cleanup
mgronlun
parents: 33593
diff changeset
   128
                               TRAPS);
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 22234
diff changeset
   129
  // Method invocation through java.lang.reflect.Constructor
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  static oop      invoke_constructor(oop method_mirror, objArrayHandle args, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
};
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   133
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 52216
diff changeset
   134
#endif // SHARE_RUNTIME_REFLECTION_HPP