1 /* 2 * Copyright (c) 2003, 2024, 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 jdk.internal.access; 27 28 import java.io.InputStream; 29 import java.io.PrintStream; 30 import java.lang.annotation.Annotation; 31 import java.lang.foreign.MemorySegment; 32 import java.lang.foreign.SymbolLookup; 33 import java.lang.invoke.MethodHandle; 34 import java.lang.invoke.MethodType; 35 import java.lang.module.ModuleDescriptor; 36 import java.lang.reflect.ClassFileFormatVersion; 37 import java.lang.reflect.Executable; 38 import java.lang.reflect.Method; 39 import java.net.URI; 40 import java.nio.charset.CharacterCodingException; 41 import java.nio.charset.Charset; 42 import java.security.ProtectionDomain; 43 import java.util.List; 44 import java.util.Map; 45 import java.util.Set; 46 import java.util.concurrent.ConcurrentHashMap; 47 import java.util.concurrent.Executor; 48 import java.util.concurrent.RejectedExecutionException; 49 import java.util.concurrent.ScheduledExecutorService; 50 import java.util.stream.Stream; 51 52 import jdk.internal.loader.NativeLibraries; 53 import jdk.internal.misc.CarrierThreadLocal; 54 import jdk.internal.module.ServicesCatalog; 55 import jdk.internal.reflect.ConstantPool; 56 import jdk.internal.vm.Continuation; 57 import jdk.internal.vm.ContinuationScope; 58 import jdk.internal.vm.StackableScope; 59 import jdk.internal.vm.ThreadContainer; 60 import sun.reflect.annotation.AnnotationType; 61 import sun.nio.ch.Interruptible; 62 63 public interface JavaLangAccess { 64 65 /** 66 * Returns the list of {@code Method} objects for the declared public 67 * methods of this class or interface that have the specified method name 68 * and parameter types. 69 */ 70 List<Method> getDeclaredPublicMethods(Class<?> klass, String name, Class<?>... parameterTypes); 71 72 /** 73 * Return most specific method that matches name and parameterTypes. 74 */ 75 Method findMethod(Class<?> klass, boolean publicOnly, String name, Class<?>... parameterTypes); 76 77 /** 78 * Return the constant pool for a class. 79 */ 80 ConstantPool getConstantPool(Class<?> klass); 81 82 /** 83 * Compare-And-Set the AnnotationType instance corresponding to this class. 84 * (This method only applies to annotation types.) 85 */ 86 boolean casAnnotationType(Class<?> klass, AnnotationType oldType, AnnotationType newType); 87 88 /** 89 * Get the AnnotationType instance corresponding to this class. 90 * (This method only applies to annotation types.) 91 */ 92 AnnotationType getAnnotationType(Class<?> klass); 93 94 /** 95 * Get the declared annotations for a given class, indexed by their types. 96 */ 97 Map<Class<? extends Annotation>, Annotation> getDeclaredAnnotationMap(Class<?> klass); 98 99 /** 100 * Get the array of bytes that is the class-file representation 101 * of this Class' annotations. 102 */ 103 byte[] getRawClassAnnotations(Class<?> klass); 104 105 /** 106 * Get the array of bytes that is the class-file representation 107 * of this Class' type annotations. 108 */ 109 byte[] getRawClassTypeAnnotations(Class<?> klass); 110 111 /** 112 * Get the array of bytes that is the class-file representation 113 * of this Executable's type annotations. 114 */ 115 byte[] getRawExecutableTypeAnnotations(Executable executable); 116 117 /** 118 * Returns the elements of an enum class or null if the 119 * Class object does not represent an enum type; 120 * the result is uncloned, cached, and shared by all callers. 121 */ 122 <E extends Enum<E>> E[] getEnumConstantsShared(Class<E> klass); 123 124 /** 125 * Set current thread's blocker field. 126 */ 127 void blockedOn(Interruptible b); 128 129 /** 130 * Registers a shutdown hook. 131 * 132 * It is expected that this method with registerShutdownInProgress=true 133 * is only used to register DeleteOnExitHook since the first file 134 * may be added to the delete on exit list by the application shutdown 135 * hooks. 136 * 137 * @param slot the slot in the shutdown hook array, whose element 138 * will be invoked in order during shutdown 139 * @param registerShutdownInProgress true to allow the hook 140 * to be registered even if the shutdown is in progress. 141 * @param hook the hook to be registered 142 * 143 * @throws IllegalStateException if shutdown is in progress and 144 * the slot is not valid to register. 145 */ 146 void registerShutdownHook(int slot, boolean registerShutdownInProgress, Runnable hook); 147 148 /** 149 * Invokes the finalize method of the given object. 150 */ 151 void invokeFinalize(Object o) throws Throwable; 152 153 /** 154 * Returns the ConcurrentHashMap used as a storage for ClassLoaderValue(s) 155 * associated with the given class loader, creating it if it doesn't already exist. 156 */ 157 ConcurrentHashMap<?, ?> createOrGetClassLoaderValueMap(ClassLoader cl); 158 159 /** 160 * Defines a class with the given name to a class loader. 161 */ 162 Class<?> defineClass(ClassLoader cl, String name, byte[] b, ProtectionDomain pd, String source); 163 164 /** 165 * Defines a class with the given name to a class loader with 166 * the given flags and class data. 167 * 168 * @see java.lang.invoke.MethodHandles.Lookup#defineClass 169 */ 170 Class<?> defineClass(ClassLoader cl, Class<?> lookup, String name, byte[] b, ProtectionDomain pd, boolean initialize, int flags, Object classData); 171 172 /** 173 * Returns a class loaded by the bootstrap class loader. 174 */ 175 Class<?> findBootstrapClassOrNull(String name); 176 177 /** 178 * Define a Package of the given name and module by the given class loader. 179 */ 180 Package definePackage(ClassLoader cl, String name, Module module); 181 182 /** 183 * Defines a new module to the Java virtual machine. The module 184 * is defined to the given class loader. 185 * 186 * The URI is for information purposes only, it can be {@code null}. 187 */ 188 Module defineModule(ClassLoader loader, ModuleDescriptor descriptor, URI uri); 189 190 /** 191 * Defines the unnamed module for the given class loader. 192 */ 193 Module defineUnnamedModule(ClassLoader loader); 194 195 /** 196 * Updates the readability so that module m1 reads m2. The new read edge 197 * does not result in a strong reference to m2 (m2 can be GC'ed). 198 * 199 * This method is the same as m1.addReads(m2) but without a permission check. 200 */ 201 void addReads(Module m1, Module m2); 202 203 /** 204 * Updates module m to read all unnamed modules. 205 */ 206 void addReadsAllUnnamed(Module m); 207 208 /** 209 * Updates module m1 to export a package unconditionally. 210 */ 211 void addExports(Module m1, String pkg); 212 213 /** 214 * Updates module m1 to export a package to module m2. The export does 215 * not result in a strong reference to m2 (m2 can be GC'ed). 216 */ 217 void addExports(Module m1, String pkg, Module m2); 218 219 /** 220 * Updates a module m to export a package to all unnamed modules. 221 */ 222 void addExportsToAllUnnamed(Module m, String pkg); 223 224 /** 225 * Updates module m1 to open a package to module m2. Opening the 226 * package does not result in a strong reference to m2 (m2 can be GC'ed). 227 */ 228 void addOpens(Module m1, String pkg, Module m2); 229 230 /** 231 * Updates module m to open a package to all unnamed modules. 232 */ 233 void addOpensToAllUnnamed(Module m, String pkg); 234 235 /** 236 * Updates module m to open all packages in the given sets. 237 */ 238 void addOpensToAllUnnamed(Module m, Set<String> concealedPkgs, Set<String> exportedPkgs); 239 240 /** 241 * Updates module m to use a service. 242 */ 243 void addUses(Module m, Class<?> service); 244 245 /** 246 * Returns true if module m reflectively exports a package to other 247 */ 248 boolean isReflectivelyExported(Module module, String pn, Module other); 249 250 /** 251 * Returns true if module m reflectively opens a package to other 252 */ 253 boolean isReflectivelyOpened(Module module, String pn, Module other); 254 255 /** 256 * Updates module m to allow access to restricted methods. 257 */ 258 Module addEnableNativeAccess(Module m); 259 260 /** 261 * Updates module named {@code name} in layer {@code layer} to allow access to restricted methods. 262 * Returns true iff the given module exists in the given layer. 263 */ 264 boolean addEnableNativeAccess(ModuleLayer layer, String name); 265 266 /** 267 * Updates all unnamed modules to allow access to restricted methods. 268 */ 269 void addEnableNativeAccessToAllUnnamed(); 270 271 /** 272 * Ensure that the given module has native access. If not, warn or throw exception depending on the configuration. 273 * @param m the module in which native access occurred 274 * @param owner the owner of the restricted method being called (or the JNI method being bound) 275 * @param methodName the name of the restricted method being called (or the JNI method being bound) 276 * @param currentClass the class calling the restricted method (for JNI, this is the same as {@code owner}) 277 * @param jni {@code true}, if this event is related to a JNI method being bound 278 */ 279 void ensureNativeAccess(Module m, Class<?> owner, String methodName, Class<?> currentClass, boolean jni); 280 281 /** 282 * Returns the ServicesCatalog for the given Layer. 283 */ 284 ServicesCatalog getServicesCatalog(ModuleLayer layer); 285 286 /** 287 * Record that this layer has at least one module defined to the given 288 * class loader. 289 */ 290 void bindToLoader(ModuleLayer layer, ClassLoader loader); 291 292 /** 293 * Returns an ordered stream of layers. The first element is the 294 * given layer, the remaining elements are its parents, in DFS order. 295 */ 296 Stream<ModuleLayer> layers(ModuleLayer layer); 297 298 /** 299 * Returns a stream of the layers that have modules defined to the 300 * given class loader. 301 */ 302 Stream<ModuleLayer> layers(ClassLoader loader); 303 304 /** 305 * Count the number of leading positive bytes in the range. 306 */ 307 int countPositives(byte[] ba, int off, int len); 308 309 /** 310 * Count the number of leading non-zero ascii chars in the String. 311 */ 312 int countNonZeroAscii(String s); 313 314 /** 315 * Constructs a new {@code String} by decoding the specified subarray of 316 * bytes using the specified {@linkplain java.nio.charset.Charset charset}. 317 * 318 * The caller of this method shall relinquish and transfer the ownership of 319 * the byte array to the callee since the later will not make a copy. 320 * 321 * @param bytes the byte array source 322 * @param cs the Charset 323 * @return the newly created string 324 * @throws CharacterCodingException for malformed or unmappable bytes 325 */ 326 String newStringNoRepl(byte[] bytes, Charset cs) throws CharacterCodingException; 327 328 /** 329 * Encode the given string into a sequence of bytes using the specified Charset. 330 * 331 * This method avoids copying the String's internal representation if the input 332 * is ASCII. 333 * 334 * This method throws CharacterCodingException instead of replacing when 335 * malformed input or unmappable characters are encountered. 336 * 337 * @param s the string to encode 338 * @param cs the charset 339 * @return the encoded bytes 340 * @throws CharacterCodingException for malformed input or unmappable characters 341 */ 342 byte[] getBytesNoRepl(String s, Charset cs) throws CharacterCodingException; 343 344 /** 345 * Returns a new string by decoding from the given utf8 bytes array. 346 * 347 * @param off the index of the first byte to decode 348 * @param len the number of bytes to decode 349 * @return the newly created string 350 * @throws IllegalArgumentException for malformed or unmappable bytes. 351 */ 352 String newStringUTF8NoRepl(byte[] bytes, int off, int len); 353 354 /** 355 * Get the char at index in a byte[] in internal UTF-16 representation, 356 * with no bounds checks. 357 * 358 * @param bytes the UTF-16 encoded bytes 359 * @param index of the char to retrieve, 0 <= index < (bytes.length >> 1) 360 * @return the char value 361 */ 362 char getUTF16Char(byte[] bytes, int index); 363 364 /** 365 * Put the char at index in a byte[] in internal UTF-16 representation, 366 * with no bounds checks. 367 * 368 * @param bytes the UTF-16 encoded bytes 369 * @param index of the char to retrieve, 0 <= index < (bytes.length >> 1) 370 */ 371 void putCharUTF16(byte[] bytes, int index, int ch); 372 373 /** 374 * Encode the given string into a sequence of bytes using utf8. 375 * 376 * @param s the string to encode 377 * @return the encoded bytes in utf8 378 * @throws IllegalArgumentException for malformed surrogates 379 */ 380 byte[] getBytesUTF8NoRepl(String s); 381 382 /** 383 * Inflated copy from byte[] to char[], as defined by StringLatin1.inflate 384 */ 385 void inflateBytesToChars(byte[] src, int srcOff, char[] dst, int dstOff, int len); 386 387 /** 388 * Decodes ASCII from the source byte array into the destination 389 * char array. 390 * 391 * @return the number of bytes successfully decoded, at most len 392 */ 393 int decodeASCII(byte[] src, int srcOff, char[] dst, int dstOff, int len); 394 395 /** 396 * Returns the initial `System.in` to determine if it is replaced 397 * with `System.setIn(newIn)` method 398 */ 399 InputStream initialSystemIn(); 400 401 /** 402 * Returns the initial value of System.err. 403 */ 404 PrintStream initialSystemErr(); 405 406 /** 407 * Encodes ASCII codepoints as possible from the source array into 408 * the destination byte array, assuming that the encoding is ASCII 409 * compatible 410 * 411 * @return the number of bytes successfully encoded, or 0 if none 412 */ 413 int encodeASCII(char[] src, int srcOff, byte[] dst, int dstOff, int len); 414 415 /** 416 * Set the cause of Throwable 417 * @param cause set t's cause to new value 418 */ 419 void setCause(Throwable t, Throwable cause); 420 421 /** 422 * Get protection domain of the given Class 423 */ 424 ProtectionDomain protectionDomain(Class<?> c); 425 426 /** 427 * Get a method handle of string concat helper method 428 */ 429 MethodHandle stringConcatHelper(String name, MethodType methodType); 430 431 /** 432 * Get the string concat initial coder 433 */ 434 long stringConcatInitialCoder(); 435 436 /** 437 * Update lengthCoder for constant 438 */ 439 long stringConcatMix(long lengthCoder, String constant); 440 441 /** 442 * Mix value length and coder into current length and coder. 443 */ 444 long stringConcatMix(long lengthCoder, char value); 445 446 Object stringConcat1(String[] constants); 447 448 /** 449 * Get the string initial coder, When COMPACT_STRINGS is on, it returns 0, and when it is off, it returns 1. 450 */ 451 byte stringInitCoder(); 452 453 /** 454 * Get the Coder of String, which is used by StringConcatFactory to calculate the initCoder of constants 455 */ 456 byte stringCoder(String str); 457 458 /** 459 * Join strings 460 */ 461 String join(String prefix, String suffix, String delimiter, String[] elements, int size); 462 463 /** 464 * Concatenation of prefix and suffix characters to a String for early bootstrap 465 */ 466 String concat(String prefix, Object value, String suffix); 467 468 /* 469 * Get the class data associated with the given class. 470 * @param c the class 471 * @see java.lang.invoke.MethodHandles.Lookup#defineHiddenClass(byte[], boolean, MethodHandles.Lookup.ClassOption...) 472 */ 473 Object classData(Class<?> c); 474 475 /** 476 * Returns the {@link NativeLibraries} object associated with the provided class loader. 477 * This is used by {@link SymbolLookup#loaderLookup()}. 478 */ 479 NativeLibraries nativeLibrariesFor(ClassLoader loader); 480 481 /** 482 * Returns an array of all platform threads. 483 */ 484 Thread[] getAllThreads(); 485 486 /** 487 * Returns the ThreadContainer for a thread, may be null. 488 */ 489 ThreadContainer threadContainer(Thread thread); 490 491 /** 492 * Starts a thread in the given ThreadContainer. 493 */ 494 void start(Thread thread, ThreadContainer container); 495 496 /** 497 * Returns the top of the given thread's stackable scope stack. 498 */ 499 StackableScope headStackableScope(Thread thread); 500 501 /** 502 * Sets the top of the current thread's stackable scope stack. 503 */ 504 void setHeadStackableScope(StackableScope scope); 505 506 /** 507 * Returns the Thread object for the current platform thread. If the 508 * current thread is a virtual thread then this method returns the carrier. 509 */ 510 Thread currentCarrierThread(); 511 512 /** 513 * Returns the value of the current carrier thread's copy of a thread-local. 514 */ 515 <T> T getCarrierThreadLocal(CarrierThreadLocal<T> local); 516 517 /** 518 * Sets the value of the current carrier thread's copy of a thread-local. 519 */ 520 <T> void setCarrierThreadLocal(CarrierThreadLocal<T> local, T value); 521 522 /** 523 * Removes the value of the current carrier thread's copy of a thread-local. 524 */ 525 void removeCarrierThreadLocal(CarrierThreadLocal<?> local); 526 527 /** 528 * Returns {@code true} if there is a value in the current carrier thread's copy of 529 * thread-local, even if that values is {@code null}. 530 */ 531 boolean isCarrierThreadLocalPresent(CarrierThreadLocal<?> local); 532 533 /** 534 * Returns the current thread's scoped values cache 535 */ 536 Object[] scopedValueCache(); 537 538 /** 539 * Sets the current thread's scoped values cache 540 */ 541 void setScopedValueCache(Object[] cache); 542 543 /** 544 * Return the current thread's scoped value bindings. 545 */ 546 Object scopedValueBindings(); 547 548 /** 549 * Returns the innermost mounted continuation 550 */ 551 Continuation getContinuation(Thread thread); 552 553 /** 554 * Sets the innermost mounted continuation 555 */ 556 void setContinuation(Thread thread, Continuation continuation); 557 558 /** 559 * The ContinuationScope of virtual thread continuations 560 */ 561 ContinuationScope virtualThreadContinuationScope(); 562 563 /** 564 * Parks the current virtual thread. 565 * @throws WrongThreadException if the current thread is not a virtual thread 566 */ 567 void parkVirtualThread(); 568 569 /** 570 * Parks the current virtual thread for up to the given waiting time. 571 * @param nanos the maximum number of nanoseconds to wait 572 * @throws WrongThreadException if the current thread is not a virtual thread 573 */ 574 void parkVirtualThread(long nanos); 575 576 /** 577 * Re-enables a virtual thread for scheduling. If the thread was parked then 578 * it will be unblocked, otherwise its next attempt to park will not block 579 * @param thread the virtual thread to unpark 580 * @throws IllegalArgumentException if the thread is not a virtual thread 581 * @throws RejectedExecutionException if the scheduler cannot accept a task 582 */ 583 void unparkVirtualThread(Thread thread); 584 585 /** 586 * Returns the virtual thread default scheduler. 587 */ 588 Executor virtualThreadDefaultScheduler(); 589 590 /** 591 * Returns a stream of the delayed task schedulers used for virtual threads. 592 */ 593 Stream<ScheduledExecutorService> virtualThreadDelayedTaskSchedulers(); 594 595 /** 596 * Creates a new StackWalker 597 */ 598 StackWalker newStackWalkerInstance(Set<StackWalker.Option> options, 599 ContinuationScope contScope, 600 Continuation continuation); 601 602 /** 603 * Returns the class file format version of the class. 604 */ 605 int classFileFormatVersion(Class<?> klass); 606 607 /** 608 * Returns '<loader-name>' @<id> if classloader has a name 609 * explicitly set otherwise <qualified-class-name> @<id> 610 */ 611 String getLoaderNameID(ClassLoader loader); 612 613 /** 614 * Copy the string bytes to an existing segment, avoiding intermediate copies. 615 */ 616 void copyToSegmentRaw(String string, MemorySegment segment, long offset); 617 618 /** 619 * Are the string bytes compatible with the given charset? 620 */ 621 boolean bytesCompatible(String string, Charset charset); 622 }