Merge
This commit is contained in:
commit
edcaebfcce
@ -273,12 +273,12 @@ SUNWprivate_1.1 {
|
||||
Java_jdk_internal_misc_VM_getRuntimeArguments;
|
||||
Java_jdk_internal_misc_VM_initialize;
|
||||
|
||||
Java_java_lang_reflect_Module_defineModule0;
|
||||
Java_java_lang_reflect_Module_addReads0;
|
||||
Java_java_lang_reflect_Module_addExports0;
|
||||
Java_java_lang_reflect_Module_addExportsToAll0;
|
||||
Java_java_lang_reflect_Module_addExportsToAllUnnamed0;
|
||||
Java_java_lang_reflect_Module_addPackage0;
|
||||
Java_java_lang_Module_defineModule0;
|
||||
Java_java_lang_Module_addReads0;
|
||||
Java_java_lang_Module_addExports0;
|
||||
Java_java_lang_Module_addExportsToAll0;
|
||||
Java_java_lang_Module_addExportsToAllUnnamed0;
|
||||
Java_java_lang_Module_addPackage0;
|
||||
|
||||
Java_jdk_internal_loader_BootLoader_getSystemPackageLocation;
|
||||
Java_jdk_internal_loader_BootLoader_getSystemPackageNames;
|
||||
|
@ -322,7 +322,7 @@ public interface ObjectInputFilter {
|
||||
* Other patterns match or reject class or package name
|
||||
* as returned from {@link Class#getName() Class.getName()} and
|
||||
* if an optional module name is present
|
||||
* {@link java.lang.reflect.Module#getName() class.getModule().getName()}.
|
||||
* {@link Module#getName() class.getModule().getName()}.
|
||||
* Note that for arrays the element type is used in the pattern,
|
||||
* not the array type.
|
||||
* <ul>
|
||||
|
@ -43,7 +43,6 @@ import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Member;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.lang.reflect.Module;
|
||||
import java.lang.reflect.Proxy;
|
||||
import java.lang.reflect.Type;
|
||||
import java.lang.reflect.TypeVariable;
|
||||
@ -2561,21 +2560,16 @@ public final class Class<T> implements java.io.Serializable,
|
||||
public InputStream getResourceAsStream(String name) {
|
||||
name = resolveName(name);
|
||||
|
||||
Module module = getModule();
|
||||
if (module.isNamed()) {
|
||||
if (Resources.canEncapsulate(name)) {
|
||||
Module caller = Reflection.getCallerClass().getModule();
|
||||
if (caller != module) {
|
||||
Set<String> packages = module.getDescriptor().packages();
|
||||
String pn = Resources.toPackageName(name);
|
||||
if (packages.contains(pn) && !module.isOpen(pn, caller)) {
|
||||
// resource is in package not open to caller
|
||||
return null;
|
||||
}
|
||||
}
|
||||
Module thisModule = getModule();
|
||||
if (thisModule.isNamed()) {
|
||||
// check if resource can be located by caller
|
||||
if (Resources.canEncapsulate(name)
|
||||
&& !isOpenToCaller(name, Reflection.getCallerClass())) {
|
||||
return null;
|
||||
}
|
||||
|
||||
String mn = module.getName();
|
||||
// resource not encapsulated or in package open to caller
|
||||
String mn = thisModule.getName();
|
||||
ClassLoader cl = getClassLoader0();
|
||||
try {
|
||||
|
||||
@ -2663,20 +2657,16 @@ public final class Class<T> implements java.io.Serializable,
|
||||
public URL getResource(String name) {
|
||||
name = resolveName(name);
|
||||
|
||||
Module module = getModule();
|
||||
if (module.isNamed()) {
|
||||
if (Resources.canEncapsulate(name)) {
|
||||
Module caller = Reflection.getCallerClass().getModule();
|
||||
if (caller != module) {
|
||||
Set<String> packages = module.getDescriptor().packages();
|
||||
String pn = Resources.toPackageName(name);
|
||||
if (packages.contains(pn) && !module.isOpen(pn, caller)) {
|
||||
// resource is in package not open to caller
|
||||
return null;
|
||||
}
|
||||
}
|
||||
Module thisModule = getModule();
|
||||
if (thisModule.isNamed()) {
|
||||
// check if resource can be located by caller
|
||||
if (Resources.canEncapsulate(name)
|
||||
&& !isOpenToCaller(name, Reflection.getCallerClass())) {
|
||||
return null;
|
||||
}
|
||||
String mn = getModule().getName();
|
||||
|
||||
// resource not encapsulated or in package open to caller
|
||||
String mn = thisModule.getName();
|
||||
ClassLoader cl = getClassLoader0();
|
||||
try {
|
||||
if (cl == null) {
|
||||
@ -2698,10 +2688,36 @@ public final class Class<T> implements java.io.Serializable,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if a resource with the given name can be located by the
|
||||
* given caller. All resources in a module can be located by code in
|
||||
* the module. For other callers, then the package needs to be open to
|
||||
* the caller.
|
||||
*/
|
||||
private boolean isOpenToCaller(String name, Class<?> caller) {
|
||||
// assert getModule().isNamed();
|
||||
Module thisModule = getModule();
|
||||
Module callerModule = (caller != null) ? caller.getModule() : null;
|
||||
if (callerModule != thisModule) {
|
||||
String pn = Resources.toPackageName(name);
|
||||
if (thisModule.getDescriptor().packages().contains(pn)) {
|
||||
if (callerModule == null && !thisModule.isOpen(pn)) {
|
||||
// no caller, package not open
|
||||
return false;
|
||||
}
|
||||
if (!thisModule.isOpen(pn, callerModule)) {
|
||||
// package not open to caller
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/** protection domain returned when the internal domain is null */
|
||||
private static java.security.ProtectionDomain allPermDomain;
|
||||
|
||||
|
||||
/**
|
||||
* Returns the {@code ProtectionDomain} of this class. If there is a
|
||||
* security manager installed, this method first calls the security
|
||||
|
@ -31,7 +31,6 @@ import java.io.UncheckedIOException;
|
||||
import java.io.File;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Module;
|
||||
import java.net.URL;
|
||||
import java.security.AccessController;
|
||||
import java.security.AccessControlContext;
|
||||
@ -352,9 +351,7 @@ public abstract class ClassLoader {
|
||||
private ClassLoader(Void unused, String name, ClassLoader parent) {
|
||||
this.name = name;
|
||||
this.parent = parent;
|
||||
this.unnamedModule
|
||||
= SharedSecrets.getJavaLangReflectModuleAccess()
|
||||
.defineUnnamedModule(this);
|
||||
this.unnamedModule = new Module(this);
|
||||
if (ParallelLoaders.isRegistered(this.getClass())) {
|
||||
parallelLockMap = new ConcurrentHashMap<>();
|
||||
package2certs = new ConcurrentHashMap<>();
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -23,13 +23,12 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package java.lang.reflect;
|
||||
package java.lang;
|
||||
|
||||
/**
|
||||
* Thrown when creating a Layer fails.
|
||||
*
|
||||
* @see Layer
|
||||
* Thrown when creating a {@linkplain ModuleLayer module layer} fails.
|
||||
*
|
||||
* @see ModuleLayer
|
||||
* @since 9
|
||||
* @spec JPMS
|
||||
*/
|
@ -23,7 +23,7 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package java.lang.reflect;
|
||||
package java.lang;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
@ -35,6 +35,7 @@ import java.lang.module.ModuleDescriptor.Exports;
|
||||
import java.lang.module.ModuleDescriptor.Opens;
|
||||
import java.lang.module.ModuleDescriptor.Version;
|
||||
import java.lang.module.ResolvedModule;
|
||||
import java.lang.reflect.AnnotatedElement;
|
||||
import java.net.URI;
|
||||
import java.net.URL;
|
||||
import java.security.AccessController;
|
||||
@ -49,12 +50,12 @@ import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import jdk.internal.loader.BuiltinClassLoader;
|
||||
import jdk.internal.loader.BootLoader;
|
||||
import jdk.internal.misc.JavaLangAccess;
|
||||
import jdk.internal.misc.JavaLangReflectModuleAccess;
|
||||
import jdk.internal.misc.SharedSecrets;
|
||||
import jdk.internal.module.ServicesCatalog;
|
||||
import jdk.internal.module.Resources;
|
||||
@ -73,7 +74,7 @@ import sun.security.util.SecurityConstants;
|
||||
*
|
||||
* <p> Named modules have a {@link #getName() name} and are constructed by the
|
||||
* Java Virtual Machine when a graph of modules is defined to the Java virtual
|
||||
* machine to create a module {@link Layer Layer}. </p>
|
||||
* machine to create a {@linkplain ModuleLayer module layer}. </p>
|
||||
*
|
||||
* <p> An unnamed module does not have a name. There is an unnamed module for
|
||||
* each {@link ClassLoader ClassLoader}, obtained by invoking its {@link
|
||||
@ -92,13 +93,13 @@ import sun.security.util.SecurityConstants;
|
||||
*
|
||||
* @since 9
|
||||
* @spec JPMS
|
||||
* @see java.lang.Class#getModule
|
||||
* @see Class#getModule()
|
||||
*/
|
||||
|
||||
public final class Module implements AnnotatedElement {
|
||||
|
||||
// the layer that contains this module, can be null
|
||||
private final Layer layer;
|
||||
private final ModuleLayer layer;
|
||||
|
||||
// module name and loader, these fields are read by VM
|
||||
private final String name;
|
||||
@ -113,10 +114,10 @@ public final class Module implements AnnotatedElement {
|
||||
* VM but will not read any other modules, will not have any exports setup
|
||||
* and will not be registered in the service catalog.
|
||||
*/
|
||||
private Module(Layer layer,
|
||||
ClassLoader loader,
|
||||
ModuleDescriptor descriptor,
|
||||
URI uri)
|
||||
Module(ModuleLayer layer,
|
||||
ClassLoader loader,
|
||||
ModuleDescriptor descriptor,
|
||||
URI uri)
|
||||
{
|
||||
this.layer = layer;
|
||||
this.name = descriptor.name();
|
||||
@ -139,7 +140,7 @@ public final class Module implements AnnotatedElement {
|
||||
*
|
||||
* @see ClassLoader#getUnnamedModule
|
||||
*/
|
||||
private Module(ClassLoader loader) {
|
||||
Module(ClassLoader loader) {
|
||||
this.layer = null;
|
||||
this.name = null;
|
||||
this.loader = loader;
|
||||
@ -217,29 +218,28 @@ public final class Module implements AnnotatedElement {
|
||||
* Returns the layer that contains this module or {@code null} if this
|
||||
* module is not in a layer.
|
||||
*
|
||||
* A module {@code Layer} contains named modules and therefore this
|
||||
* method always returns {@code null} when invoked on an unnamed module.
|
||||
* A module layer contains named modules and therefore this method always
|
||||
* returns {@code null} when invoked on an unnamed module.
|
||||
*
|
||||
* <p> <a href="Proxy.html#dynamicmodule">Dynamic modules</a> are named
|
||||
* modules that are generated at runtime. A dynamic module may or may
|
||||
* not be in a module Layer. </p>
|
||||
* <p> <a href="reflect/Proxy.html#dynamicmodule">Dynamic modules</a> are
|
||||
* named modules that are generated at runtime. A dynamic module may or may
|
||||
* not be in a module layer. </p>
|
||||
*
|
||||
* @return The layer that contains this module
|
||||
* @return The module layer that contains this module
|
||||
*
|
||||
* @see Proxy
|
||||
* @see java.lang.reflect.Proxy
|
||||
*/
|
||||
public Layer getLayer() {
|
||||
public ModuleLayer getLayer() {
|
||||
if (isNamed()) {
|
||||
Layer layer = this.layer;
|
||||
ModuleLayer layer = this.layer;
|
||||
if (layer != null)
|
||||
return layer;
|
||||
|
||||
// special-case java.base as it is created before the boot Layer
|
||||
// special-case java.base as it is created before the boot layer
|
||||
if (loader == null && name.equals("java.base")) {
|
||||
return SharedSecrets.getJavaLangAccess().getBootLayer();
|
||||
return ModuleLayer.boot();
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@ -338,7 +338,7 @@ public final class Module implements AnnotatedElement {
|
||||
public Module addReads(Module other) {
|
||||
Objects.requireNonNull(other);
|
||||
if (this.isNamed()) {
|
||||
Module caller = Reflection.getCallerClass().getModule();
|
||||
Module caller = getCallerModule(Reflection.getCallerClass());
|
||||
if (caller != this) {
|
||||
throw new IllegalCallerException(caller + " != " + this);
|
||||
}
|
||||
@ -350,12 +350,21 @@ public final class Module implements AnnotatedElement {
|
||||
/**
|
||||
* Updates this module to read another module.
|
||||
*
|
||||
* @apiNote This method is for Proxy use and white-box testing.
|
||||
* @apiNote Used by the --add-reads command line option.
|
||||
*/
|
||||
void implAddReads(Module other) {
|
||||
implAddReads(other, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates this module to read all unnamed modules.
|
||||
*
|
||||
* @apiNote Used by the --add-reads command line option.
|
||||
*/
|
||||
void implAddReadsAllUnnamed() {
|
||||
implAddReads(Module.ALL_UNNAMED_MODULE, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates this module to read another module without notifying the VM.
|
||||
*
|
||||
@ -371,6 +380,7 @@ public final class Module implements AnnotatedElement {
|
||||
* If {@code syncVM} is {@code true} then the VM is notified.
|
||||
*/
|
||||
private void implAddReads(Module other, boolean syncVM) {
|
||||
Objects.requireNonNull(other);
|
||||
if (!canRead(other)) {
|
||||
// update VM first, just in case it fails
|
||||
if (syncVM) {
|
||||
@ -659,7 +669,7 @@ public final class Module implements AnnotatedElement {
|
||||
Objects.requireNonNull(other);
|
||||
|
||||
if (isNamed()) {
|
||||
Module caller = Reflection.getCallerClass().getModule();
|
||||
Module caller = getCallerModule(Reflection.getCallerClass());
|
||||
if (caller != this) {
|
||||
throw new IllegalCallerException(caller + " != " + this);
|
||||
}
|
||||
@ -706,8 +716,8 @@ public final class Module implements AnnotatedElement {
|
||||
Objects.requireNonNull(other);
|
||||
|
||||
if (isNamed()) {
|
||||
Module caller = Reflection.getCallerClass().getModule();
|
||||
if (caller != this && !isOpen(pn, caller))
|
||||
Module caller = getCallerModule(Reflection.getCallerClass());
|
||||
if (caller != this && (caller == null || !isOpen(pn, caller)))
|
||||
throw new IllegalCallerException(pn + " is not open to " + caller);
|
||||
implAddExportsOrOpens(pn, other, /*open*/true, /*syncVM*/true);
|
||||
}
|
||||
@ -717,36 +727,80 @@ public final class Module implements AnnotatedElement {
|
||||
|
||||
|
||||
/**
|
||||
* Updates the exports so that package {@code pn} is exported to module
|
||||
* {@code other} but without notifying the VM.
|
||||
* Updates this module to export a package unconditionally.
|
||||
*
|
||||
* @apiNote This method is for VM white-box testing.
|
||||
* @apiNote This method is for JDK tests only.
|
||||
*/
|
||||
void implAddExportsNoSync(String pn, Module other) {
|
||||
if (other == null)
|
||||
other = EVERYONE_MODULE;
|
||||
implAddExportsOrOpens(pn.replace('/', '.'), other, false, false);
|
||||
void implAddExports(String pn) {
|
||||
implAddExportsOrOpens(pn, Module.EVERYONE_MODULE, false, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the exports so that package {@code pn} is exported to module
|
||||
* {@code other}.
|
||||
* Updates this module to export a package to another module.
|
||||
*
|
||||
* @apiNote This method is for white-box testing.
|
||||
* @apiNote Used by Instrumentation::redefineModule and --add-exports
|
||||
*/
|
||||
void implAddExports(String pn, Module other) {
|
||||
implAddExportsOrOpens(pn, other, false, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the module to open package {@code pn} to module {@code other}.
|
||||
* Updates this module to export a package to all unnamed modules.
|
||||
*
|
||||
* @apiNote This method is for white-box tests and jtreg
|
||||
* @apiNote Used by the --add-exports command line option.
|
||||
*/
|
||||
void implAddExportsToAllUnnamed(String pn) {
|
||||
implAddExportsOrOpens(pn, Module.ALL_UNNAMED_MODULE, false, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates this export to export a package unconditionally without
|
||||
* notifying the VM.
|
||||
*
|
||||
* @apiNote This method is for VM white-box testing.
|
||||
*/
|
||||
void implAddExportsNoSync(String pn) {
|
||||
implAddExportsOrOpens(pn.replace('/', '.'), Module.EVERYONE_MODULE, false, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates a module to export a package to another module without
|
||||
* notifying the VM.
|
||||
*
|
||||
* @apiNote This method is for VM white-box testing.
|
||||
*/
|
||||
void implAddExportsNoSync(String pn, Module other) {
|
||||
implAddExportsOrOpens(pn.replace('/', '.'), other, false, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates this module to open a package unconditionally.
|
||||
*
|
||||
* @apiNote This method is for JDK tests only.
|
||||
*/
|
||||
void implAddOpens(String pn) {
|
||||
implAddExportsOrOpens(pn, Module.EVERYONE_MODULE, true, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates this module to open a package to another module.
|
||||
*
|
||||
* @apiNote Used by Instrumentation::redefineModule and --add-opens
|
||||
*/
|
||||
void implAddOpens(String pn, Module other) {
|
||||
implAddExportsOrOpens(pn, other, true, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates this module to export a package to all unnamed modules.
|
||||
*
|
||||
* @apiNote Used by the --add-opens command line option.
|
||||
*/
|
||||
void implAddOpensToAllUnnamed(String pn) {
|
||||
implAddExportsOrOpens(pn, Module.ALL_UNNAMED_MODULE, true, true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Updates a module to export or open a module to another module.
|
||||
*
|
||||
@ -831,7 +885,7 @@ public final class Module implements AnnotatedElement {
|
||||
Objects.requireNonNull(service);
|
||||
|
||||
if (isNamed() && !descriptor.isAutomatic()) {
|
||||
Module caller = Reflection.getCallerClass().getModule();
|
||||
Module caller = getCallerModule(Reflection.getCallerClass());
|
||||
if (caller != this) {
|
||||
throw new IllegalCallerException(caller + " != " + this);
|
||||
}
|
||||
@ -899,33 +953,28 @@ public final class Module implements AnnotatedElement {
|
||||
|
||||
|
||||
/**
|
||||
* Returns an array of the package names of the packages in this module.
|
||||
* Returns the set of package names for the packages in this module.
|
||||
*
|
||||
* <p> For named modules, the returned array contains an element for each
|
||||
* <p> For named modules, the returned set contains an element for each
|
||||
* package in the module. </p>
|
||||
*
|
||||
* <p> For unnamed modules, this method is the equivalent to invoking the
|
||||
* {@link ClassLoader#getDefinedPackages() getDefinedPackages} method of
|
||||
* this module's class loader and returning the array of package names. </p>
|
||||
* this module's class loader and returning the set of package names. </p>
|
||||
*
|
||||
* <p> A package name appears at most once in the returned array. </p>
|
||||
*
|
||||
* @apiNote This method returns an array rather than a {@code Set} for
|
||||
* consistency with other {@code java.lang.reflect} types.
|
||||
*
|
||||
* @return an array of the package names of the packages in this module
|
||||
* @return the set of the package names of the packages in this module
|
||||
*/
|
||||
public String[] getPackages() {
|
||||
public Set<String> getPackages() {
|
||||
if (isNamed()) {
|
||||
|
||||
Set<String> packages = descriptor.packages();
|
||||
Map<String, Boolean> extraPackages = this.extraPackages;
|
||||
if (extraPackages == null) {
|
||||
return packages.toArray(new String[0]);
|
||||
return packages;
|
||||
} else {
|
||||
return Stream.concat(packages.stream(),
|
||||
extraPackages.keySet().stream())
|
||||
.toArray(String[]::new);
|
||||
.collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
} else {
|
||||
@ -936,7 +985,7 @@ public final class Module implements AnnotatedElement {
|
||||
} else {
|
||||
packages = SharedSecrets.getJavaLangAccess().packages(loader);
|
||||
}
|
||||
return packages.map(Package::getName).toArray(String[]::new);
|
||||
return packages.map(Package::getName).collect(Collectors.toSet());
|
||||
}
|
||||
}
|
||||
|
||||
@ -1013,12 +1062,12 @@ public final class Module implements AnnotatedElement {
|
||||
*/
|
||||
static Map<String, Module> defineModules(Configuration cf,
|
||||
Function<String, ClassLoader> clf,
|
||||
Layer layer)
|
||||
ModuleLayer layer)
|
||||
{
|
||||
Map<String, Module> nameToModule = new HashMap<>();
|
||||
Map<String, ClassLoader> moduleToLoader = new HashMap<>();
|
||||
|
||||
boolean isBootLayer = (Layer.boot() == null);
|
||||
boolean isBootLayer = (ModuleLayer.boot() == null);
|
||||
Set<ClassLoader> loaders = new HashSet<>();
|
||||
|
||||
// map each module to a class loader
|
||||
@ -1074,7 +1123,7 @@ public final class Module implements AnnotatedElement {
|
||||
assert m2 != null;
|
||||
} else {
|
||||
// parent layer
|
||||
for (Layer parent: layer.parents()) {
|
||||
for (ModuleLayer parent: layer.parents()) {
|
||||
m2 = findModule(parent, other);
|
||||
if (m2 != null)
|
||||
break;
|
||||
@ -1133,7 +1182,8 @@ public final class Module implements AnnotatedElement {
|
||||
* Find the runtime Module corresponding to the given ResolvedModule
|
||||
* in the given parent layer (or its parents).
|
||||
*/
|
||||
private static Module findModule(Layer parent, ResolvedModule resolvedModule) {
|
||||
private static Module findModule(ModuleLayer parent,
|
||||
ResolvedModule resolvedModule) {
|
||||
Configuration cf = resolvedModule.configuration();
|
||||
String dn = resolvedModule.name();
|
||||
return parent.layers()
|
||||
@ -1156,7 +1206,7 @@ public final class Module implements AnnotatedElement {
|
||||
private static void initExportsAndOpens(Module m,
|
||||
Map<String, Module> nameToSource,
|
||||
Map<String, Module> nameToModule,
|
||||
List<Layer> parents) {
|
||||
List<ModuleLayer> parents) {
|
||||
// The VM doesn't special case open or automatic modules so need to
|
||||
// export all packages
|
||||
ModuleDescriptor descriptor = m.getDescriptor();
|
||||
@ -1246,12 +1296,12 @@ public final class Module implements AnnotatedElement {
|
||||
private static Module findModule(String target,
|
||||
Map<String, Module> nameToSource,
|
||||
Map<String, Module> nameToModule,
|
||||
List<Layer> parents) {
|
||||
List<ModuleLayer> parents) {
|
||||
Module m = nameToSource.get(target);
|
||||
if (m == null) {
|
||||
m = nameToModule.get(target);
|
||||
if (m == null) {
|
||||
for (Layer parent : parents) {
|
||||
for (ModuleLayer parent : parents) {
|
||||
m = parent.findModule(target).orElse(null);
|
||||
if (m != null) break;
|
||||
}
|
||||
@ -1445,14 +1495,18 @@ public final class Module implements AnnotatedElement {
|
||||
}
|
||||
|
||||
if (isNamed() && Resources.canEncapsulate(name)) {
|
||||
Module caller = Reflection.getCallerClass().getModule();
|
||||
Module caller = getCallerModule(Reflection.getCallerClass());
|
||||
if (caller != this && caller != Object.class.getModule()) {
|
||||
// ignore packages added for proxies via addPackage
|
||||
Set<String> packages = getDescriptor().packages();
|
||||
String pn = Resources.toPackageName(name);
|
||||
if (packages.contains(pn) && !isOpen(pn, caller)) {
|
||||
// resource is in package not open to caller
|
||||
return null;
|
||||
if (getPackages().contains(pn)) {
|
||||
if (caller == null && !isOpen(pn)) {
|
||||
// no caller, package not open
|
||||
return null;
|
||||
}
|
||||
if (!isOpen(pn, caller)) {
|
||||
// package not open to caller
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1497,6 +1551,14 @@ public final class Module implements AnnotatedElement {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the module that a given caller class is a member of. Returns
|
||||
* {@code null} if the caller is {@code null}.
|
||||
*/
|
||||
private Module getCallerModule(Class<?> caller) {
|
||||
return (caller != null) ? caller.getModule() : null;
|
||||
}
|
||||
|
||||
|
||||
// -- native methods --
|
||||
|
||||
@ -1521,71 +1583,4 @@ public final class Module implements AnnotatedElement {
|
||||
|
||||
// JVM_AddModulePackage
|
||||
private static native void addPackage0(Module m, String pn);
|
||||
|
||||
/**
|
||||
* Register shared secret to provide access to package-private methods
|
||||
*/
|
||||
static {
|
||||
SharedSecrets.setJavaLangReflectModuleAccess(
|
||||
new JavaLangReflectModuleAccess() {
|
||||
@Override
|
||||
public Module defineUnnamedModule(ClassLoader loader) {
|
||||
return new Module(loader);
|
||||
}
|
||||
@Override
|
||||
public Module defineModule(ClassLoader loader,
|
||||
ModuleDescriptor descriptor,
|
||||
URI uri) {
|
||||
return new Module(null, loader, descriptor, uri);
|
||||
}
|
||||
@Override
|
||||
public void addReads(Module m1, Module m2) {
|
||||
m1.implAddReads(m2, true);
|
||||
}
|
||||
@Override
|
||||
public void addReadsAllUnnamed(Module m) {
|
||||
m.implAddReads(Module.ALL_UNNAMED_MODULE);
|
||||
}
|
||||
@Override
|
||||
public void addExports(Module m, String pn) {
|
||||
m.implAddExportsOrOpens(pn, Module.EVERYONE_MODULE, false, true);
|
||||
}
|
||||
@Override
|
||||
public void addExports(Module m, String pn, Module other) {
|
||||
m.implAddExportsOrOpens(pn, other, false, true);
|
||||
}
|
||||
@Override
|
||||
public void addExportsToAllUnnamed(Module m, String pn) {
|
||||
m.implAddExportsOrOpens(pn, Module.ALL_UNNAMED_MODULE, false, true);
|
||||
}
|
||||
@Override
|
||||
public void addOpens(Module m, String pn) {
|
||||
m.implAddExportsOrOpens(pn, Module.EVERYONE_MODULE, true, true);
|
||||
}
|
||||
@Override
|
||||
public void addOpens(Module m, String pn, Module other) {
|
||||
m.implAddExportsOrOpens(pn, other, true, true);
|
||||
}
|
||||
@Override
|
||||
public void addOpensToAllUnnamed(Module m, String pn) {
|
||||
m.implAddExportsOrOpens(pn, Module.ALL_UNNAMED_MODULE, true, true);
|
||||
}
|
||||
@Override
|
||||
public void addUses(Module m, Class<?> service) {
|
||||
m.implAddUses(service);
|
||||
}
|
||||
@Override
|
||||
public ServicesCatalog getServicesCatalog(Layer layer) {
|
||||
return layer.getServicesCatalog();
|
||||
}
|
||||
@Override
|
||||
public Stream<Layer> layers(Layer layer) {
|
||||
return layer.layers();
|
||||
}
|
||||
@Override
|
||||
public Stream<Layer> layers(ClassLoader loader) {
|
||||
return Layer.layers(loader);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -23,7 +23,7 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package java.lang.reflect;
|
||||
package java.lang;
|
||||
|
||||
import java.lang.module.Configuration;
|
||||
import java.lang.module.ModuleDescriptor;
|
||||
@ -47,8 +47,6 @@ import java.util.stream.Stream;
|
||||
import jdk.internal.loader.ClassLoaderValue;
|
||||
import jdk.internal.loader.Loader;
|
||||
import jdk.internal.loader.LoaderPool;
|
||||
import jdk.internal.misc.SharedSecrets;
|
||||
import jdk.internal.module.Modules;
|
||||
import jdk.internal.module.ServicesCatalog;
|
||||
import sun.security.util.SecurityConstants;
|
||||
|
||||
@ -70,15 +68,16 @@ import sun.security.util.SecurityConstants;
|
||||
*
|
||||
* <p> The {@link #defineModulesWithOneLoader defineModulesWithOneLoader} and
|
||||
* {@link #defineModulesWithManyLoaders defineModulesWithManyLoaders} methods
|
||||
* provide convenient ways to create a {@code Layer} where all modules are
|
||||
* provide convenient ways to create a module layer where all modules are
|
||||
* mapped to a single class loader or where each module is mapped to its own
|
||||
* class loader. The {@link #defineModules defineModules} method is for more
|
||||
* advanced cases where modules are mapped to custom class loaders by means of
|
||||
* a function specified to the method. Each of these methods has an instance
|
||||
* and static variant. The instance methods create a layer with the receiver
|
||||
* as the parent layer. The static methods are for more advanced cases where
|
||||
* there can be more than one parent layer or where a {@link Layer.Controller
|
||||
* Controller} is needed to control modules in the layer. </p>
|
||||
* there can be more than one parent layer or where a {@link
|
||||
* ModuleLayer.Controller Controller} is needed to control modules in the layer
|
||||
* </p>
|
||||
*
|
||||
* <p> A Java virtual machine has at least one non-empty layer, the {@link
|
||||
* #boot() boot} layer, that is created when the Java virtual machine is
|
||||
@ -131,13 +130,13 @@ import sun.security.util.SecurityConstants;
|
||||
* <pre>{@code
|
||||
* ModuleFinder finder = ModuleFinder.of(dir1, dir2, dir3);
|
||||
*
|
||||
* Layer parent = Layer.boot();
|
||||
* ModuleLayer parent = ModuleLayer.boot();
|
||||
*
|
||||
* Configuration cf = parent.configuration().resolve(finder, ModuleFinder.of(), Set.of("myapp"));
|
||||
*
|
||||
* ClassLoader scl = ClassLoader.getSystemClassLoader();
|
||||
*
|
||||
* Layer layer = parent.defineModulesWithOneLoader(cf, scl);
|
||||
* ModuleLayer layer = parent.defineModulesWithOneLoader(cf, scl);
|
||||
*
|
||||
* Class<?> c = layer.findLoader("myapp").loadClass("app.Main");
|
||||
* }</pre>
|
||||
@ -147,27 +146,27 @@ import sun.security.util.SecurityConstants;
|
||||
* @see Module#getLayer()
|
||||
*/
|
||||
|
||||
public final class Layer {
|
||||
public final class ModuleLayer {
|
||||
|
||||
// the empty Layer
|
||||
private static final Layer EMPTY_LAYER
|
||||
= new Layer(Configuration.empty(), List.of(), null);
|
||||
// the empty layer
|
||||
private static final ModuleLayer EMPTY_LAYER
|
||||
= new ModuleLayer(Configuration.empty(), List.of(), null);
|
||||
|
||||
// the configuration from which this Layer was created
|
||||
// the configuration from which this ;ayer was created
|
||||
private final Configuration cf;
|
||||
|
||||
// parent layers, empty in the case of the empty layer
|
||||
private final List<Layer> parents;
|
||||
private final List<ModuleLayer> parents;
|
||||
|
||||
// maps module name to jlr.Module
|
||||
private final Map<String, Module> nameToModule;
|
||||
|
||||
/**
|
||||
* Creates a new Layer from the modules in the given configuration.
|
||||
* Creates a new module layer from the modules in the given configuration.
|
||||
*/
|
||||
private Layer(Configuration cf,
|
||||
List<Layer> parents,
|
||||
Function<String, ClassLoader> clf)
|
||||
private ModuleLayer(Configuration cf,
|
||||
List<ModuleLayer> parents,
|
||||
Function<String, ClassLoader> clf)
|
||||
{
|
||||
this.cf = cf;
|
||||
this.parents = parents; // no need to do defensive copy
|
||||
@ -182,9 +181,9 @@ public final class Layer {
|
||||
}
|
||||
|
||||
/**
|
||||
* Controls a layer. The static methods defined by {@link Layer} to create
|
||||
* module layers return a {@code Controller} that can be used to control
|
||||
* modules in the layer.
|
||||
* Controls a module layer. The static methods defined by {@link ModuleLayer}
|
||||
* to create module layers return a {@code Controller} that can be used to
|
||||
* control modules in the layer.
|
||||
*
|
||||
* <p> Unless otherwise specified, passing a {@code null} argument to a
|
||||
* method in this class causes a {@link NullPointerException
|
||||
@ -197,18 +196,18 @@ public final class Layer {
|
||||
* @spec JPMS
|
||||
*/
|
||||
public static final class Controller {
|
||||
private final Layer layer;
|
||||
private final ModuleLayer layer;
|
||||
|
||||
Controller(Layer layer) {
|
||||
Controller(ModuleLayer layer) {
|
||||
this.layer = layer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the layer that this object controls.
|
||||
*
|
||||
* @return the layer
|
||||
* @return the module layer
|
||||
*/
|
||||
public Layer layer() {
|
||||
public ModuleLayer layer() {
|
||||
return layer;
|
||||
}
|
||||
|
||||
@ -235,14 +234,13 @@ public final class Layer {
|
||||
* @return This controller
|
||||
*
|
||||
* @throws IllegalArgumentException
|
||||
* If {@code source} is not in the layer
|
||||
* If {@code source} is not in the module layer
|
||||
*
|
||||
* @see Module#addReads
|
||||
*/
|
||||
public Controller addReads(Module source, Module target) {
|
||||
ensureInLayer(source);
|
||||
Objects.requireNonNull(target);
|
||||
Modules.addReads(source, target);
|
||||
source.implAddReads(target);
|
||||
return this;
|
||||
}
|
||||
|
||||
@ -261,23 +259,21 @@ public final class Layer {
|
||||
* @return This controller
|
||||
*
|
||||
* @throws IllegalArgumentException
|
||||
* If {@code source} is not in the layer or the package is not
|
||||
* in the source module
|
||||
* If {@code source} is not in the module layer or the package
|
||||
* is not in the source module
|
||||
*
|
||||
* @see Module#addOpens
|
||||
*/
|
||||
public Controller addOpens(Module source, String pn, Module target) {
|
||||
ensureInLayer(source);
|
||||
Objects.requireNonNull(pn);
|
||||
Objects.requireNonNull(target);
|
||||
Modules.addOpens(source, pn, target);
|
||||
source.implAddOpens(pn, target);
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates a new layer, with this layer as its parent, by defining the
|
||||
* Creates a new module layer, with this layer as its parent, by defining the
|
||||
* modules in the given {@code Configuration} to the Java virtual machine.
|
||||
* This method creates one class loader and defines all modules to that
|
||||
* class loader. The {@link ClassLoader#getParent() parent} of each class
|
||||
@ -288,7 +284,7 @@ public final class Layer {
|
||||
* parent. In other words, if this layer is {@code thisLayer} then this
|
||||
* method is equivalent to invoking:
|
||||
* <pre> {@code
|
||||
* Layer.defineModulesWithOneLoader(cf, List.of(thisLayer), parentLoader).layer();
|
||||
* ModuleLayer.defineModulesWithOneLoader(cf, List.of(thisLayer), parentLoader).layer();
|
||||
* }</pre>
|
||||
*
|
||||
* @param cf
|
||||
@ -312,14 +308,14 @@ public final class Layer {
|
||||
*
|
||||
* @see #findLoader
|
||||
*/
|
||||
public Layer defineModulesWithOneLoader(Configuration cf,
|
||||
ClassLoader parentLoader) {
|
||||
public ModuleLayer defineModulesWithOneLoader(Configuration cf,
|
||||
ClassLoader parentLoader) {
|
||||
return defineModulesWithOneLoader(cf, List.of(this), parentLoader).layer();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates a new layer, with this layer as its parent, by defining the
|
||||
* Creates a new module layer, with this layer as its parent, by defining the
|
||||
* modules in the given {@code Configuration} to the Java virtual machine.
|
||||
* Each module is defined to its own {@link ClassLoader} created by this
|
||||
* method. The {@link ClassLoader#getParent() parent} of each class loader
|
||||
@ -330,7 +326,7 @@ public final class Layer {
|
||||
* parent. In other words, if this layer is {@code thisLayer} then this
|
||||
* method is equivalent to invoking:
|
||||
* <pre> {@code
|
||||
* Layer.defineModulesWithManyLoaders(cf, List.of(thisLayer), parentLoader).layer();
|
||||
* ModuleLayer.defineModulesWithManyLoaders(cf, List.of(thisLayer), parentLoader).layer();
|
||||
* }</pre>
|
||||
*
|
||||
* @param cf
|
||||
@ -354,14 +350,14 @@ public final class Layer {
|
||||
*
|
||||
* @see #findLoader
|
||||
*/
|
||||
public Layer defineModulesWithManyLoaders(Configuration cf,
|
||||
ClassLoader parentLoader) {
|
||||
public ModuleLayer defineModulesWithManyLoaders(Configuration cf,
|
||||
ClassLoader parentLoader) {
|
||||
return defineModulesWithManyLoaders(cf, List.of(this), parentLoader).layer();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates a new layer, with this layer as its parent, by defining the
|
||||
* Creates a new module layer, with this layer as its parent, by defining the
|
||||
* modules in the given {@code Configuration} to the Java virtual machine.
|
||||
* Each module is mapped, by name, to its class loader by means of the
|
||||
* given function. This method works exactly as specified by the static
|
||||
@ -370,7 +366,7 @@ public final class Layer {
|
||||
* this layer is {@code thisLayer} then this method is equivalent to
|
||||
* invoking:
|
||||
* <pre> {@code
|
||||
* Layer.defineModules(cf, List.of(thisLayer), clf).layer();
|
||||
* ModuleLayer.defineModules(cf, List.of(thisLayer), clf).layer();
|
||||
* }</pre>
|
||||
*
|
||||
* @param cf
|
||||
@ -390,13 +386,13 @@ public final class Layer {
|
||||
* If {@code RuntimePermission("getClassLoader")} is denied by
|
||||
* the security manager
|
||||
*/
|
||||
public Layer defineModules(Configuration cf,
|
||||
Function<String, ClassLoader> clf) {
|
||||
public ModuleLayer defineModules(Configuration cf,
|
||||
Function<String, ClassLoader> clf) {
|
||||
return defineModules(cf, List.of(this), clf).layer();
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new layer by defining the modules in the given {@code
|
||||
* Creates a new module layer by defining the modules in the given {@code
|
||||
* Configuration} to the Java virtual machine. This method creates one
|
||||
* class loader and defines all modules to that class loader.
|
||||
*
|
||||
@ -458,10 +454,10 @@ public final class Layer {
|
||||
* @see #findLoader
|
||||
*/
|
||||
public static Controller defineModulesWithOneLoader(Configuration cf,
|
||||
List<Layer> parentLayers,
|
||||
List<ModuleLayer> parentLayers,
|
||||
ClassLoader parentLoader)
|
||||
{
|
||||
List<Layer> parents = new ArrayList<>(parentLayers);
|
||||
List<ModuleLayer> parents = new ArrayList<>(parentLayers);
|
||||
checkConfiguration(cf, parents);
|
||||
|
||||
checkCreateClassLoaderPermission();
|
||||
@ -470,7 +466,7 @@ public final class Layer {
|
||||
try {
|
||||
Loader loader = new Loader(cf.modules(), parentLoader);
|
||||
loader.initRemotePackageMap(cf, parents);
|
||||
Layer layer = new Layer(cf, parents, mn -> loader);
|
||||
ModuleLayer layer = new ModuleLayer(cf, parents, mn -> loader);
|
||||
return new Controller(layer);
|
||||
} catch (IllegalArgumentException | IllegalStateException e) {
|
||||
throw new LayerInstantiationException(e.getMessage());
|
||||
@ -478,7 +474,7 @@ public final class Layer {
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new layer by defining the modules in the given {@code
|
||||
* Creates a new module layer by defining the modules in the given {@code
|
||||
* Configuration} to the Java virtual machine. Each module is defined to
|
||||
* its own {@link ClassLoader} created by this method. The {@link
|
||||
* ClassLoader#getParent() parent} of each class loader is the given parent
|
||||
@ -528,10 +524,10 @@ public final class Layer {
|
||||
* @see #findLoader
|
||||
*/
|
||||
public static Controller defineModulesWithManyLoaders(Configuration cf,
|
||||
List<Layer> parentLayers,
|
||||
List<ModuleLayer> parentLayers,
|
||||
ClassLoader parentLoader)
|
||||
{
|
||||
List<Layer> parents = new ArrayList<>(parentLayers);
|
||||
List<ModuleLayer> parents = new ArrayList<>(parentLayers);
|
||||
checkConfiguration(cf, parents);
|
||||
|
||||
checkCreateClassLoaderPermission();
|
||||
@ -539,7 +535,7 @@ public final class Layer {
|
||||
|
||||
LoaderPool pool = new LoaderPool(cf, parents, parentLoader);
|
||||
try {
|
||||
Layer layer = new Layer(cf, parents, pool::loaderFor);
|
||||
ModuleLayer layer = new ModuleLayer(cf, parents, pool::loaderFor);
|
||||
return new Controller(layer);
|
||||
} catch (IllegalArgumentException | IllegalStateException e) {
|
||||
throw new LayerInstantiationException(e.getMessage());
|
||||
@ -547,7 +543,7 @@ public final class Layer {
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new layer by defining the modules in the given {@code
|
||||
* Creates a new module layer by defining the modules in the given {@code
|
||||
* Configuration} to the Java virtual machine. The given function maps each
|
||||
* module in the configuration, by name, to a class loader. Creating the
|
||||
* layer informs the Java virtual machine about the classes that may be
|
||||
@ -562,7 +558,7 @@ public final class Layer {
|
||||
* ready to load from these modules before there are any attempts to load
|
||||
* classes or resources. </p>
|
||||
*
|
||||
* <p> Creating a {@code Layer} can fail for the following reasons: </p>
|
||||
* <p> Creating a layer can fail for the following reasons: </p>
|
||||
*
|
||||
* <ul>
|
||||
*
|
||||
@ -589,7 +585,7 @@ public final class Layer {
|
||||
* or runtime exception then it is propagated to the caller of this method.
|
||||
* </p>
|
||||
*
|
||||
* @apiNote It is implementation specific as to whether creating a Layer
|
||||
* @apiNote It is implementation specific as to whether creating a layer
|
||||
* with this method is an atomic operation or not. Consequentially it is
|
||||
* possible for this method to fail with some modules, but not all, defined
|
||||
* to the Java virtual machine.
|
||||
@ -613,10 +609,10 @@ public final class Layer {
|
||||
* the security manager
|
||||
*/
|
||||
public static Controller defineModules(Configuration cf,
|
||||
List<Layer> parentLayers,
|
||||
List<ModuleLayer> parentLayers,
|
||||
Function<String, ClassLoader> clf)
|
||||
{
|
||||
List<Layer> parents = new ArrayList<>(parentLayers);
|
||||
List<ModuleLayer> parents = new ArrayList<>(parentLayers);
|
||||
checkConfiguration(cf, parents);
|
||||
Objects.requireNonNull(clf);
|
||||
|
||||
@ -628,7 +624,7 @@ public final class Layer {
|
||||
}
|
||||
|
||||
try {
|
||||
Layer layer = new Layer(cf, parents, clf);
|
||||
ModuleLayer layer = new ModuleLayer(cf, parents, clf);
|
||||
return new Controller(layer);
|
||||
} catch (IllegalArgumentException | IllegalStateException e) {
|
||||
throw new LayerInstantiationException(e.getMessage());
|
||||
@ -641,7 +637,7 @@ public final class Layer {
|
||||
* the parent layers.
|
||||
*/
|
||||
private static void checkConfiguration(Configuration cf,
|
||||
List<Layer> parentLayers)
|
||||
List<ModuleLayer> parentLayers)
|
||||
{
|
||||
Objects.requireNonNull(cf);
|
||||
|
||||
@ -650,7 +646,7 @@ public final class Layer {
|
||||
throw new IllegalArgumentException("wrong number of parents");
|
||||
|
||||
int index = 0;
|
||||
for (Layer parent : parentLayers) {
|
||||
for (ModuleLayer parent : parentLayers) {
|
||||
if (parent.configuration() != parentConfigurations.get(index)) {
|
||||
throw new IllegalArgumentException(
|
||||
"Parent of configuration != configuration of this Layer");
|
||||
@ -727,7 +723,7 @@ public final class Layer {
|
||||
*
|
||||
* @return The list of this layer's parents
|
||||
*/
|
||||
public List<Layer> parents() {
|
||||
public List<ModuleLayer> parents() {
|
||||
return parents;
|
||||
}
|
||||
|
||||
@ -739,24 +735,24 @@ public final class Layer {
|
||||
* @implNote For now, the assumption is that the number of elements will
|
||||
* be very low and so this method does not use a specialized spliterator.
|
||||
*/
|
||||
Stream<Layer> layers() {
|
||||
List<Layer> allLayers = this.allLayers;
|
||||
Stream<ModuleLayer> layers() {
|
||||
List<ModuleLayer> allLayers = this.allLayers;
|
||||
if (allLayers != null)
|
||||
return allLayers.stream();
|
||||
|
||||
allLayers = new ArrayList<>();
|
||||
Set<Layer> visited = new HashSet<>();
|
||||
Deque<Layer> stack = new ArrayDeque<>();
|
||||
Set<ModuleLayer> visited = new HashSet<>();
|
||||
Deque<ModuleLayer> stack = new ArrayDeque<>();
|
||||
visited.add(this);
|
||||
stack.push(this);
|
||||
|
||||
while (!stack.isEmpty()) {
|
||||
Layer layer = stack.pop();
|
||||
ModuleLayer layer = stack.pop();
|
||||
allLayers.add(layer);
|
||||
|
||||
// push in reverse order
|
||||
for (int i = layer.parents.size() - 1; i >= 0; i--) {
|
||||
Layer parent = layer.parents.get(i);
|
||||
ModuleLayer parent = layer.parents.get(i);
|
||||
if (!visited.contains(parent)) {
|
||||
visited.add(parent);
|
||||
stack.push(parent);
|
||||
@ -768,7 +764,7 @@ public final class Layer {
|
||||
return allLayers.stream();
|
||||
}
|
||||
|
||||
private volatile List<Layer> allLayers;
|
||||
private volatile List<ModuleLayer> allLayers;
|
||||
|
||||
/**
|
||||
* Returns the set of the modules in this layer.
|
||||
@ -856,9 +852,9 @@ public final class Layer {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string describing this layer.
|
||||
* Returns a string describing this module layer.
|
||||
*
|
||||
* @return A possibly empty string describing this layer
|
||||
* @return A possibly empty string describing this module layer
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
@ -873,7 +869,7 @@ public final class Layer {
|
||||
*
|
||||
* @return The empty layer
|
||||
*/
|
||||
public static Layer empty() {
|
||||
public static ModuleLayer empty() {
|
||||
return EMPTY_LAYER;
|
||||
}
|
||||
|
||||
@ -887,11 +883,10 @@ public final class Layer {
|
||||
*
|
||||
* @return The boot layer
|
||||
*/
|
||||
public static Layer boot() {
|
||||
return SharedSecrets.getJavaLangAccess().getBootLayer();
|
||||
public static ModuleLayer boot() {
|
||||
return System.bootLayer;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the ServicesCatalog for this Layer, creating it if not
|
||||
* already created.
|
||||
@ -922,10 +917,10 @@ public final class Layer {
|
||||
*/
|
||||
void bindToLoader(ClassLoader loader) {
|
||||
// CLV.computeIfAbsent(loader, (cl, clv) -> new CopyOnWriteArrayList<>())
|
||||
List<Layer> list = CLV.get(loader);
|
||||
List<ModuleLayer> list = CLV.get(loader);
|
||||
if (list == null) {
|
||||
list = new CopyOnWriteArrayList<>();
|
||||
List<Layer> previous = CLV.putIfAbsent(loader, list);
|
||||
List<ModuleLayer> previous = CLV.putIfAbsent(loader, list);
|
||||
if (previous != null) list = previous;
|
||||
}
|
||||
list.add(this);
|
||||
@ -935,8 +930,8 @@ public final class Layer {
|
||||
* Returns a stream of the layers that have at least one module defined to
|
||||
* the given class loader.
|
||||
*/
|
||||
static Stream<Layer> layers(ClassLoader loader) {
|
||||
List<Layer> list = CLV.get(loader);
|
||||
static Stream<ModuleLayer> layers(ClassLoader loader) {
|
||||
List<ModuleLayer> list = CLV.get(loader);
|
||||
if (list != null) {
|
||||
return list.stream();
|
||||
} else {
|
||||
@ -945,5 +940,5 @@ public final class Layer {
|
||||
}
|
||||
|
||||
// the list of layers with modules defined to a class loader
|
||||
private static final ClassLoaderValue<List<Layer>> CLV = new ClassLoaderValue<>();
|
||||
private static final ClassLoaderValue<List<ModuleLayer>> CLV = new ClassLoaderValue<>();
|
||||
}
|
@ -26,7 +26,6 @@ package java.lang;
|
||||
|
||||
import java.lang.module.Configuration;
|
||||
import java.lang.module.ModuleReference;
|
||||
import java.lang.reflect.Module;
|
||||
import java.net.URI;
|
||||
|
||||
/**
|
||||
|
@ -27,7 +27,6 @@ package java.lang;
|
||||
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.lang.reflect.AnnotatedElement;
|
||||
import java.lang.reflect.Module;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URI;
|
||||
import java.net.URL;
|
||||
|
@ -29,9 +29,7 @@ import java.lang.RuntimePermission;
|
||||
import java.lang.module.ModuleDescriptor;
|
||||
import java.lang.module.ModuleDescriptor.Exports;
|
||||
import java.lang.module.ModuleDescriptor.Opens;
|
||||
import java.lang.reflect.Layer;
|
||||
import java.lang.reflect.Member;
|
||||
import java.lang.reflect.Module;
|
||||
import java.io.FileDescriptor;
|
||||
import java.io.File;
|
||||
import java.io.FilePermission;
|
||||
@ -1441,7 +1439,7 @@ class SecurityManager {
|
||||
|
||||
static {
|
||||
// Get the modules in the boot layer
|
||||
Stream<Module> bootLayerModules = Layer.boot().modules().stream();
|
||||
Stream<Module> bootLayerModules = ModuleLayer.boot().modules().stream();
|
||||
|
||||
// Filter out the modules loaded by the boot or platform loader
|
||||
PrivilegedAction<Set<Module>> pa = () ->
|
||||
|
@ -33,8 +33,6 @@ import jdk.internal.module.ModuleReferenceImpl;
|
||||
import java.lang.module.ModuleDescriptor.Version;
|
||||
import java.lang.module.ModuleReference;
|
||||
import java.lang.module.ResolvedModule;
|
||||
import java.lang.reflect.Layer;
|
||||
import java.lang.reflect.Module;
|
||||
import java.util.HashSet;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
@ -191,7 +189,7 @@ public final class StackTraceElement implements java.io.Serializable {
|
||||
* if the module name is not available.
|
||||
* @since 9
|
||||
* @spec JPMS
|
||||
* @see java.lang.reflect.Module#getName()
|
||||
* @see Module#getName()
|
||||
*/
|
||||
public String getModuleName() {
|
||||
return moduleName;
|
||||
@ -480,7 +478,7 @@ public final class StackTraceElement implements java.io.Serializable {
|
||||
if (!VM.isModuleSystemInited())
|
||||
return true;
|
||||
|
||||
return Layer.boot() == m.getLayer() && HashedModules.contains(m);
|
||||
return ModuleLayer.boot() == m.getLayer() && HashedModules.contains(m);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -492,7 +490,7 @@ public final class StackTraceElement implements java.io.Serializable {
|
||||
|
||||
static Set<String> hashedModules() {
|
||||
|
||||
Optional<ResolvedModule> resolvedModule = Layer.boot()
|
||||
Optional<ResolvedModule> resolvedModule = ModuleLayer.boot()
|
||||
.configuration()
|
||||
.findModule("java.base");
|
||||
assert resolvedModule.isPresent();
|
||||
|
@ -35,33 +35,32 @@ import java.io.InputStream;
|
||||
import java.io.PrintStream;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.lang.module.ModuleDescriptor;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.Executable;
|
||||
import java.lang.reflect.Layer;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.lang.reflect.Module;
|
||||
import java.net.URI;
|
||||
import java.net.URL;
|
||||
import java.security.AccessControlContext;
|
||||
import java.security.ProtectionDomain;
|
||||
import java.util.Properties;
|
||||
import java.util.PropertyPermission;
|
||||
import java.util.Map;
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
import java.nio.channels.Channel;
|
||||
import java.nio.channels.spi.SelectorProvider;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Properties;
|
||||
import java.util.PropertyPermission;
|
||||
import java.util.ResourceBundle;
|
||||
import java.util.function.Supplier;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.ResourceBundle;
|
||||
import java.util.function.Supplier;
|
||||
import sun.nio.ch.Interruptible;
|
||||
import jdk.internal.module.ModuleBootstrap;
|
||||
import jdk.internal.module.ServicesCatalog;
|
||||
import jdk.internal.reflect.CallerSensitive;
|
||||
import jdk.internal.reflect.Reflection;
|
||||
import sun.security.util.SecurityConstants;
|
||||
import sun.reflect.annotation.AnnotationType;
|
||||
import jdk.internal.HotSpotIntrinsicCandidate;
|
||||
import jdk.internal.misc.JavaLangAccess;;
|
||||
import jdk.internal.misc.SharedSecrets;;
|
||||
@ -69,8 +68,9 @@ import jdk.internal.misc.VM;
|
||||
import jdk.internal.logger.LoggerFinderLoader;
|
||||
import jdk.internal.logger.LazyLoggers;
|
||||
import jdk.internal.logger.LocalizedLoggerWrapper;
|
||||
|
||||
import jdk.internal.module.ModuleBootstrap;
|
||||
import sun.reflect.annotation.AnnotationType;
|
||||
import sun.nio.ch.Interruptible;
|
||||
import sun.security.util.SecurityConstants;
|
||||
|
||||
/**
|
||||
* The <code>System</code> class contains several useful class fields
|
||||
@ -1160,7 +1160,7 @@ public final class System {
|
||||
* @param msg the string message (or a key in the message catalog, if
|
||||
* this logger is a {@link
|
||||
* LoggerFinder#getLocalizedLogger(java.lang.String,
|
||||
* java.util.ResourceBundle, java.lang.reflect.Module) localized logger});
|
||||
* java.util.ResourceBundle, java.lang.Module) localized logger});
|
||||
* can be {@code null}.
|
||||
*
|
||||
* @throws NullPointerException if {@code level} is {@code null}.
|
||||
@ -1228,7 +1228,7 @@ public final class System {
|
||||
* @param msg the string message (or a key in the message catalog, if
|
||||
* this logger is a {@link
|
||||
* LoggerFinder#getLocalizedLogger(java.lang.String,
|
||||
* java.util.ResourceBundle, java.lang.reflect.Module) localized logger});
|
||||
* java.util.ResourceBundle, java.lang.Module) localized logger});
|
||||
* can be {@code null}.
|
||||
* @param thrown a {@code Throwable} associated with the log message;
|
||||
* can be {@code null}.
|
||||
@ -1277,7 +1277,7 @@ public final class System {
|
||||
* java.text.MessageFormat} format, (or a key in the message
|
||||
* catalog, if this logger is a {@link
|
||||
* LoggerFinder#getLocalizedLogger(java.lang.String,
|
||||
* java.util.ResourceBundle, java.lang.reflect.Module) localized logger});
|
||||
* java.util.ResourceBundle, java.lang.Module) localized logger});
|
||||
* can be {@code null}.
|
||||
* @param params an optional list of parameters to the message (may be
|
||||
* none).
|
||||
@ -1482,7 +1482,7 @@ public final class System {
|
||||
* message localization.
|
||||
*
|
||||
* @implSpec By default, this method calls {@link
|
||||
* #getLogger(java.lang.String, java.lang.reflect.Module)
|
||||
* #getLogger(java.lang.String, java.lang.Module)
|
||||
* this.getLogger(name, module)} to obtain a logger, then wraps that
|
||||
* logger in a {@link Logger} instance where all methods that do not
|
||||
* take a {@link ResourceBundle} as parameter are redirected to one
|
||||
@ -1566,7 +1566,7 @@ public final class System {
|
||||
* @implSpec
|
||||
* Instances returned by this method route messages to loggers
|
||||
* obtained by calling {@link LoggerFinder#getLogger(java.lang.String,
|
||||
* java.lang.reflect.Module) LoggerFinder.getLogger(name, module)}, where
|
||||
* java.lang.Module) LoggerFinder.getLogger(name, module)}, where
|
||||
* {@code module} is the caller's module.
|
||||
* In cases where {@code System.getLogger} is called from a context where
|
||||
* there is no caller frame on the stack (e.g when called directly
|
||||
@ -1579,7 +1579,7 @@ public final class System {
|
||||
*
|
||||
* @apiNote
|
||||
* This method may defer calling the {@link
|
||||
* LoggerFinder#getLogger(java.lang.String, java.lang.reflect.Module)
|
||||
* LoggerFinder#getLogger(java.lang.String, java.lang.Module)
|
||||
* LoggerFinder.getLogger} method to create an actual logger supplied by
|
||||
* the logging backend, for instance, to allow loggers to be obtained during
|
||||
* the system initialization time.
|
||||
@ -1612,7 +1612,7 @@ public final class System {
|
||||
* @implSpec
|
||||
* The returned logger will perform message localization as specified
|
||||
* by {@link LoggerFinder#getLocalizedLogger(java.lang.String,
|
||||
* java.util.ResourceBundle, java.lang.reflect.Module)
|
||||
* java.util.ResourceBundle, java.lang.Module)
|
||||
* LoggerFinder.getLocalizedLogger(name, bundle, module)}, where
|
||||
* {@code module} is the caller's module.
|
||||
* In cases where {@code System.getLogger} is called from a context where
|
||||
@ -1977,7 +1977,7 @@ public final class System {
|
||||
}
|
||||
|
||||
// @see #initPhase2()
|
||||
private static Layer bootLayer;
|
||||
static ModuleLayer bootLayer;
|
||||
|
||||
/*
|
||||
* Invoked by VM. Phase 2 module system initialization.
|
||||
@ -2101,9 +2101,6 @@ public final class System {
|
||||
public void invokeFinalize(Object o) throws Throwable {
|
||||
o.finalize();
|
||||
}
|
||||
public Layer getBootLayer() {
|
||||
return bootLayer;
|
||||
}
|
||||
public ConcurrentHashMap<?, ?> createOrGetClassLoaderValueMap(ClassLoader cl) {
|
||||
return cl.createOrGetClassLoaderValueMap();
|
||||
}
|
||||
@ -2128,6 +2125,44 @@ public final class System {
|
||||
public void invalidatePackageAccessCache() {
|
||||
SecurityManager.invalidatePackageAccessCache();
|
||||
}
|
||||
public Module defineModule(ClassLoader loader,
|
||||
ModuleDescriptor descriptor,
|
||||
URI uri) {
|
||||
return new Module(null, loader, descriptor, uri);
|
||||
}
|
||||
public Module defineUnnamedModule(ClassLoader loader) {
|
||||
return new Module(loader);
|
||||
}
|
||||
public void addReads(Module m1, Module m2) {
|
||||
m1.implAddReads(m2);
|
||||
}
|
||||
public void addReadsAllUnnamed(Module m) {
|
||||
m.implAddReadsAllUnnamed();
|
||||
}
|
||||
public void addExports(Module m, String pn, Module other) {
|
||||
m.implAddExports(pn, other);
|
||||
}
|
||||
public void addExportsToAllUnnamed(Module m, String pn) {
|
||||
m.implAddExportsToAllUnnamed(pn);
|
||||
}
|
||||
public void addOpens(Module m, String pn, Module other) {
|
||||
m.implAddOpens(pn, other);
|
||||
}
|
||||
public void addOpensToAllUnnamed(Module m, String pn) {
|
||||
m.implAddOpensToAllUnnamed(pn);
|
||||
}
|
||||
public void addUses(Module m, Class<?> service) {
|
||||
m.implAddUses(service);
|
||||
}
|
||||
public ServicesCatalog getServicesCatalog(ModuleLayer layer) {
|
||||
return layer.getServicesCatalog();
|
||||
}
|
||||
public Stream<ModuleLayer> layers(ModuleLayer layer) {
|
||||
return layer.layers();
|
||||
}
|
||||
public Stream<ModuleLayer> layers(ClassLoader loader) {
|
||||
return ModuleLayer.layers(loader);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -22,7 +22,7 @@
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.lang.reflect;
|
||||
package java.lang;
|
||||
|
||||
import java.lang.ref.Reference;
|
||||
import java.lang.ref.ReferenceQueue;
|
@ -33,7 +33,6 @@ import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Member;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.lang.reflect.Module;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
|
@ -43,7 +43,6 @@ import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Member;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.lang.reflect.Module;
|
||||
import java.lang.reflect.ReflectPermission;
|
||||
import java.nio.ByteOrder;
|
||||
import java.security.AccessController;
|
||||
@ -668,11 +667,11 @@ public class MethodHandles {
|
||||
* The value is {@code 0x20}, which does not correspond meaningfully to
|
||||
* any particular {@linkplain java.lang.reflect.Modifier modifier bit}.
|
||||
* A {@code Lookup} with this lookup mode assumes {@linkplain
|
||||
* java.lang.reflect.Module#canRead(java.lang.reflect.Module) readability}.
|
||||
* java.lang.Module#canRead(java.lang.Module) readability}.
|
||||
* In conjunction with the {@code PUBLIC} modifier bit, a {@code Lookup}
|
||||
* with this lookup mode can access all public members of public types
|
||||
* of all modules where the type is in a package that is {@link
|
||||
* java.lang.reflect.Module#isExported(String) exported unconditionally}.
|
||||
* java.lang.Module#isExported(String) exported unconditionally}.
|
||||
* @since 9
|
||||
* @spec JPMS
|
||||
* @see #publicLookup()
|
||||
|
@ -64,11 +64,11 @@ import java.util.stream.Stream;
|
||||
* with the receiver as the parent configuration. The static methods are for
|
||||
* more advanced cases where there can be more than one parent configuration. </p>
|
||||
*
|
||||
* <p> Each {@link java.lang.reflect.Layer layer} of modules in the Java virtual
|
||||
* <p> Each {@link java.lang.ModuleLayer layer} of modules in the Java virtual
|
||||
* machine is created from a configuration. The configuration for the {@link
|
||||
* java.lang.reflect.Layer#boot() boot} layer is obtained by invoking {@code
|
||||
* Layer.boot().configuration()}. The configuration for the boot layer will
|
||||
* often be the parent when creating new configurations. </p>
|
||||
* java.lang.ModuleLayer#boot() boot} layer is obtained by invoking {@code
|
||||
* ModuleLayer.boot().configuration()}. The configuration for the boot layer
|
||||
* will often be the parent when creating new configurations. </p>
|
||||
*
|
||||
* <h3> Example </h3>
|
||||
*
|
||||
@ -81,7 +81,7 @@ import java.util.stream.Stream;
|
||||
* <pre>{@code
|
||||
* ModuleFinder finder = ModuleFinder.of(dir1, dir2, dir3);
|
||||
*
|
||||
* Configuration parent = Layer.boot().configuration();
|
||||
* Configuration parent = ModuleLayer.boot().configuration();
|
||||
*
|
||||
* Configuration cf = parent.resolve(finder, ModuleFinder.of(), Set.of("myapp"));
|
||||
* cf.modules().forEach(m -> {
|
||||
@ -95,7 +95,7 @@ import java.util.stream.Stream;
|
||||
*
|
||||
* @since 9
|
||||
* @spec JPMS
|
||||
* @see java.lang.reflect.Layer
|
||||
* @see java.lang.ModuleLayer
|
||||
*/
|
||||
public final class Configuration {
|
||||
|
||||
|
@ -60,7 +60,7 @@ import jdk.internal.module.ModuleInfo;
|
||||
* <p> A module descriptor describes a named module and defines methods to
|
||||
* obtain each of its components. The module descriptor for a named module
|
||||
* in the Java virtual machine is obtained by invoking the {@link
|
||||
* java.lang.reflect.Module Module}'s {@link java.lang.reflect.Module#getDescriptor
|
||||
* java.lang.Module Module}'s {@link java.lang.Module#getDescriptor
|
||||
* getDescriptor} method. Module descriptors can also be created using the
|
||||
* {@link ModuleDescriptor.Builder} class or by reading the binary form of a
|
||||
* module declaration ({@code module-info.class}) using the {@link
|
||||
@ -85,7 +85,7 @@ import jdk.internal.module.ModuleInfo;
|
||||
* <p> {@code ModuleDescriptor} objects are immutable and safe for use by
|
||||
* multiple concurrent threads.</p>
|
||||
*
|
||||
* @see java.lang.reflect.Module
|
||||
* @see java.lang.Module
|
||||
* @since 9
|
||||
* @spec JPMS
|
||||
*/
|
||||
@ -2110,7 +2110,9 @@ public class ModuleDescriptor
|
||||
|
||||
/**
|
||||
* Sets the module main class. The package for the main class is added
|
||||
* to the module if not already added.
|
||||
* to the module if not already added. In other words, this method is
|
||||
* equivalent to first invoking this builder's {@link #packages(Set)
|
||||
* packages} method to add the package name of the main class.
|
||||
*
|
||||
* @param mc
|
||||
* The module main class
|
||||
@ -2134,8 +2136,8 @@ public class ModuleDescriptor
|
||||
throw new IllegalArgumentException(mc + ": unnamed package");
|
||||
}
|
||||
}
|
||||
mainClass = mc;
|
||||
packages.add(pn);
|
||||
mainClass = mc;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
@ -228,14 +228,14 @@ public interface ModuleFinder {
|
||||
* directory is treated as an exploded module rather than a directory of
|
||||
* modules. </p>
|
||||
*
|
||||
* <p> The module finder returned by this method supports modules that are
|
||||
* packaged as JAR files. A JAR file with a {@code module-info.class} in
|
||||
* the top-level directory of the JAR file (or overridden by a versioned
|
||||
* entry in a {@link java.util.jar.JarFile#isMultiRelease() multi-release}
|
||||
* JAR file) is a modular JAR and is an <em>explicit module</em>.
|
||||
* A JAR file that does not have a {@code module-info.class} in the
|
||||
* top-level directory is created as an automatic module. The components
|
||||
* for the automatic module are derived as follows:
|
||||
* <p id="automatic-modules"> The module finder returned by this method
|
||||
* supports modules packaged as JAR files. A JAR file with a {@code
|
||||
* module-info.class} in its top-level directory, or in a versioned entry
|
||||
* in a {@linkplain java.util.jar.JarFile#isMultiRelease() multi-release}
|
||||
* JAR file, is a modular JAR file and thus defines an <em>explicit</em>
|
||||
* module. A JAR file that does not have a {@code module-info.class} in its
|
||||
* top-level directory defines an <em>automatic module</em>, as follows:
|
||||
* </p>
|
||||
*
|
||||
* <ul>
|
||||
*
|
||||
@ -254,16 +254,16 @@ public interface ModuleFinder {
|
||||
* ModuleDescriptor.Version} and ignored if it cannot be parsed as
|
||||
* a {@code Version}. </p></li>
|
||||
*
|
||||
* <li><p> For the module name, then any trailing digits and dots
|
||||
* are removed, all non-alphanumeric characters ({@code [^A-Za-z0-9]})
|
||||
* are replaced with a dot ({@code "."}), all repeating dots are
|
||||
* replaced with one dot, and all leading and trailing dots are
|
||||
* removed. </p></li>
|
||||
* <li><p> All non-alphanumeric characters ({@code [^A-Za-z0-9]})
|
||||
* in the module name are replaced with a dot ({@code "."}), all
|
||||
* repeating dots are replaced with one dot, and all leading and
|
||||
* trailing dots are removed. </p></li>
|
||||
*
|
||||
* <li><p> As an example, a JAR file named {@code foo-bar.jar} will
|
||||
* derive a module name {@code foo.bar} and no version. A JAR file
|
||||
* named {@code foo-1.2.3-SNAPSHOT.jar} will derive a module name
|
||||
* {@code foo} and {@code 1.2.3-SNAPSHOT} as the version. </p></li>
|
||||
* named {@code foo-bar-1.2.3-SNAPSHOT.jar} will derive a module
|
||||
* name {@code foo.bar} and {@code 1.2.3-SNAPSHOT} as the version.
|
||||
* </p></li>
|
||||
*
|
||||
* </ul></li>
|
||||
*
|
||||
@ -312,7 +312,9 @@ public interface ModuleFinder {
|
||||
*
|
||||
* <p> As with automatic modules, the contents of a packaged or exploded
|
||||
* module may need to be <em>scanned</em> in order to determine the packages
|
||||
* in the module. If a {@code .class} file (other than {@code
|
||||
* in the module. Whether {@linkplain java.nio.file.Files#isHidden(Path)
|
||||
* hidden files} are ignored or not is implementation specific and therefore
|
||||
* not specified. If a {@code .class} file (other than {@code
|
||||
* module-info.class}) is found in the top-level directory then it is
|
||||
* assumed to be a class in the unnamed package and so {@code FindException}
|
||||
* is thrown. </p>
|
||||
|
@ -28,7 +28,6 @@ package java.lang.module;
|
||||
import java.io.PrintStream;
|
||||
import java.lang.module.ModuleDescriptor.Provides;
|
||||
import java.lang.module.ModuleDescriptor.Requires.Modifier;
|
||||
import java.lang.reflect.Layer;
|
||||
import java.util.ArrayDeque;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
@ -67,6 +66,9 @@ final class Resolver {
|
||||
// maps module name to module reference
|
||||
private final Map<String, ModuleReference> nameToReference = new HashMap<>();
|
||||
|
||||
// true if all automatic modules have been found
|
||||
private boolean haveAllAutomaticModules;
|
||||
|
||||
// module constraints on target platform
|
||||
private String osName;
|
||||
private String osArch;
|
||||
@ -171,6 +173,21 @@ final class Resolver {
|
||||
ModuleDescriptor descriptor = q.poll();
|
||||
assert nameToReference.containsKey(descriptor.name());
|
||||
|
||||
// if the module is an automatic module then all automatic
|
||||
// modules need to be resolved
|
||||
if (descriptor.isAutomatic() && !haveAllAutomaticModules) {
|
||||
addFoundAutomaticModules().forEach(mref -> {
|
||||
ModuleDescriptor other = mref.descriptor();
|
||||
q.offer(other);
|
||||
if (isTracing()) {
|
||||
trace("Automatic module %s located, required by %s",
|
||||
other.name(), descriptor.name());
|
||||
mref.location().ifPresent(uri -> trace(" (%s)", uri));
|
||||
}
|
||||
});
|
||||
haveAllAutomaticModules = true;
|
||||
}
|
||||
|
||||
// process dependences
|
||||
for (ModuleDescriptor.Requires requires : descriptor.requires()) {
|
||||
|
||||
@ -199,10 +216,15 @@ final class Resolver {
|
||||
if (!nameToReference.containsKey(dn)) {
|
||||
addFoundModule(mref);
|
||||
q.offer(mref.descriptor());
|
||||
resolved.add(mref.descriptor());
|
||||
|
||||
if (isTracing()) {
|
||||
trace("Module %s located, required by %s",
|
||||
String prefix;
|
||||
if (mref.descriptor().isAutomatic()) {
|
||||
prefix = "Automatic module";
|
||||
} else {
|
||||
prefix = "Module";
|
||||
}
|
||||
trace(prefix + " %s located, required by %s",
|
||||
dn, descriptor.name());
|
||||
mref.location().ifPresent(uri -> trace(" (%s)", uri));
|
||||
}
|
||||
@ -250,7 +272,7 @@ final class Resolver {
|
||||
|
||||
// the initial set of modules that may use services
|
||||
Set<ModuleDescriptor> initialConsumers;
|
||||
if (Layer.boot() == null) {
|
||||
if (ModuleLayer.boot() == null) {
|
||||
initialConsumers = new HashSet<>();
|
||||
} else {
|
||||
initialConsumers = parents.stream()
|
||||
@ -301,6 +323,21 @@ final class Resolver {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add all automatic modules that have not already been found to the
|
||||
* nameToReference map.
|
||||
*/
|
||||
private Set<ModuleReference> addFoundAutomaticModules() {
|
||||
Set<ModuleReference> result = new HashSet<>();
|
||||
findAll().forEach(mref -> {
|
||||
String mn = mref.descriptor().name();
|
||||
if (mref.descriptor().isAutomatic() && !nameToReference.containsKey(mn)) {
|
||||
addFoundModule(mref);
|
||||
result.add(mref);
|
||||
}
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the module to the nameToReference map. Also check any constraints on
|
||||
@ -534,7 +571,7 @@ final class Resolver {
|
||||
// need "requires transitive" from the modules in parent configurations
|
||||
// as there may be selected modules that have a dependency on modules in
|
||||
// the parent configuration.
|
||||
if (Layer.boot() == null) {
|
||||
if (ModuleLayer.boot() == null) {
|
||||
g2 = new HashMap<>(capacity);
|
||||
} else {
|
||||
g2 = parents.stream()
|
||||
|
@ -70,7 +70,7 @@
|
||||
* } </pre>
|
||||
*
|
||||
* <p> If module {@code m1} is resolved with the configuration for the {@link
|
||||
* java.lang.reflect.Layer#boot() boot} layer as the parent then the resulting
|
||||
* java.lang.ModuleLayer#boot() boot} layer as the parent then the resulting
|
||||
* configuration contains two modules ({@code m1}, {@code m2}). The edges in
|
||||
* its readability graph are:
|
||||
* <pre> {@code
|
||||
@ -92,10 +92,10 @@
|
||||
*
|
||||
* <p> {@link java.lang.module.ModuleDescriptor#isAutomatic() Automatic} modules
|
||||
* receive special treatment during resolution. Each automatic module is resolved
|
||||
* so that it reads all other modules in the configuration and all parent
|
||||
* configurations. Each automatic module is also resolved as if it
|
||||
* "{@code requires transitive}" all other automatic modules in the configuration
|
||||
* (and all automatic modules in parent configurations). </p>
|
||||
* as if it "{@code requires transitive}" all observable automatic modules and
|
||||
* all automatic modules in the parent configurations. Each automatic module is
|
||||
* resolved so that it reads all other modules in the resulting configuration and
|
||||
* all modules in parent configurations. </p>
|
||||
*
|
||||
* <h2><a name="servicebinding">Service binding</a></h2>
|
||||
*
|
||||
|
@ -227,11 +227,11 @@ import static java.lang.module.ModuleDescriptor.Modifier.SYNTHETIC;
|
||||
* {@code Proxy.newProxyInstance} method should be used instead.
|
||||
*
|
||||
* <p>
|
||||
* A dynamic module can read the modules of all of the superinterfaces of a proxy class
|
||||
* and the modules of the types referenced by all public method signatures
|
||||
* A dynamic module can read the modules of all of the superinterfaces of a proxy
|
||||
* class and the modules of the types referenced by all public method signatures
|
||||
* of a proxy class. If a superinterface or a referenced type, say {@code T},
|
||||
* is in a non-exported package, the {@linkplain java.lang.reflect.Module module}
|
||||
* of {@code T} is updated to export the package of {@code T} to the dynamic module.
|
||||
* is in a non-exported package, the {@linkplain Module module} of {@code T} is
|
||||
* updated to export the package of {@code T} to the dynamic module.
|
||||
*
|
||||
* <h3>Methods Duplicated in Multiple Proxy Interfaces</h3>
|
||||
*
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -25,11 +25,10 @@
|
||||
|
||||
/**
|
||||
* Provides classes and interfaces for obtaining reflective information about
|
||||
* modules, classes and objects. Reflection allows programmatic access to
|
||||
* information about modules and to the fields, methods and constructors of
|
||||
* loaded classes, and the use of reflected fields, methods, and constructors
|
||||
* to operate on their underlying counterparts, within encapsulation and
|
||||
* security restrictions.
|
||||
* classes and objects. Reflection allows programmatic access to information
|
||||
* about the fields, methods and constructors of loaded classes, and the use
|
||||
* of reflected fields, methods, and constructors to operate on their underlying
|
||||
* counterparts, within encapsulation and security restrictions.
|
||||
*
|
||||
* <p>{@code AccessibleObject} allows suppression of access checks if
|
||||
* the necessary {@code ReflectPermission} is available.
|
||||
|
@ -50,7 +50,6 @@ import java.lang.ref.WeakReference;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.lang.reflect.Module;
|
||||
import java.net.JarURLConnection;
|
||||
import java.net.URL;
|
||||
import java.net.URLConnection;
|
||||
|
@ -31,10 +31,8 @@ import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Layer;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.lang.reflect.Module;
|
||||
import java.net.URL;
|
||||
import java.net.URLConnection;
|
||||
import java.security.AccessControlContext;
|
||||
@ -50,7 +48,6 @@ import java.util.stream.StreamSupport;
|
||||
import jdk.internal.loader.BootLoader;
|
||||
import jdk.internal.loader.ClassLoaders;
|
||||
import jdk.internal.misc.JavaLangAccess;
|
||||
import jdk.internal.misc.JavaLangReflectModuleAccess;
|
||||
import jdk.internal.misc.SharedSecrets;
|
||||
import jdk.internal.misc.VM;
|
||||
import jdk.internal.module.ServicesCatalog;
|
||||
@ -160,7 +157,7 @@ import jdk.internal.reflect.Reflection;
|
||||
* <h2> Locating providers </h2>
|
||||
*
|
||||
* <p> The {@code load} methods locate providers using a class loader or module
|
||||
* {@link Layer layer}. When locating providers using a class loader then
|
||||
* {@link ModuleLayer layer}. When locating providers using a class loader then
|
||||
* providers in both named and unnamed modules may be located. When locating
|
||||
* providers using a module layer then only providers in named modules in
|
||||
* the layer (or parent layers) are located.
|
||||
@ -168,11 +165,11 @@ import jdk.internal.reflect.Reflection;
|
||||
* <p> When locating providers using a class loader then any providers in named
|
||||
* modules defined to the class loader, or any class loader that is reachable
|
||||
* via parent delegation, are located. Additionally, providers in module layers
|
||||
* other than the {@link Layer#boot() boot} layer, where the module layer
|
||||
* other than the {@link ModuleLayer#boot() boot} layer, where the module layer
|
||||
* contains modules defined to the class loader, or any class loader reachable
|
||||
* via parent delegation, are also located. For example, suppose there is a
|
||||
* module layer where each module is defined to its own class loader (see {@link
|
||||
* Layer#defineModulesWithManyLoaders defineModulesWithManyLoaders}). If the
|
||||
* ModuleLayer#defineModulesWithManyLoaders defineModulesWithManyLoaders}). If the
|
||||
* {@code load} method is invoked to locate providers using any of these class
|
||||
* loaders for this layer then it will locate all of the providers in that
|
||||
* layer, irrespective of their defining class loader.
|
||||
@ -198,7 +195,7 @@ import jdk.internal.reflect.Reflection;
|
||||
* will locate providers in modules defined to the class loader, then its
|
||||
* parent class loader, its parent parent, and so on to the bootstrap class
|
||||
* loader. If a {@code ClassLoader}, or any class loader in the parent
|
||||
* delegation chain, defines modules in a custom module {@link Layer} then
|
||||
* delegation chain, defines modules in a custom module {@link ModuleLayer} then
|
||||
* all providers in that layer are located, irrespective of their class
|
||||
* loader. The ordering of modules defined to the same class loader, or the
|
||||
* ordering of modules in a layer, is not defined. </li>
|
||||
@ -216,11 +213,11 @@ import jdk.internal.reflect.Reflection;
|
||||
* method finds the service configuration files. </li>
|
||||
* </ul>
|
||||
*
|
||||
* <p> Service loaders created to locate providers in a module {@link Layer}
|
||||
* will first locate providers in the layer, before locating providers in
|
||||
* parent layers. Traversal of parent layers is depth-first with each layer
|
||||
* visited at most once. For example, suppose L0 is the boot layer, L1 and
|
||||
* L2 are custom layers with L0 as their parent. Now suppose that L3 is
|
||||
* <p> Service loaders created to locate providers in a {@linkplain ModuleLayer
|
||||
* module layer} will first locate providers in the layer, before locating
|
||||
* providers in parent layers. Traversal of parent layers is depth-first with
|
||||
* each layer visited at most once. For example, suppose L0 is the boot layer,
|
||||
* L1 and L2 are custom layers with L0 as their parent. Now suppose that L3 is
|
||||
* created with L1 and L2 as the parents (in that order). Using a service
|
||||
* loader to locate providers with L3 as the content will locate providers
|
||||
* in the following order: L3, L1, L0, L2. The ordering of modules in a layer
|
||||
@ -352,12 +349,12 @@ public final class ServiceLoader<S>
|
||||
// The class of the service type
|
||||
private final String serviceName;
|
||||
|
||||
// The module Layer used to locate providers; null when locating
|
||||
// The module layer used to locate providers; null when locating
|
||||
// providers using a class loader
|
||||
private final Layer layer;
|
||||
private final ModuleLayer layer;
|
||||
|
||||
// The class loader used to locate, load, and instantiate providers;
|
||||
// null when locating provider using a module Layer
|
||||
// null when locating provider using a module layer
|
||||
private final ClassLoader loader;
|
||||
|
||||
// The access control context taken when the ServiceLoader is created
|
||||
@ -376,10 +373,8 @@ public final class ServiceLoader<S>
|
||||
private int reloadCount;
|
||||
|
||||
private static JavaLangAccess LANG_ACCESS;
|
||||
private static JavaLangReflectModuleAccess JLRM_ACCESS;
|
||||
static {
|
||||
LANG_ACCESS = SharedSecrets.getJavaLangAccess();
|
||||
JLRM_ACCESS = SharedSecrets.getJavaLangReflectModuleAccess();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -425,13 +420,13 @@ public final class ServiceLoader<S>
|
||||
|
||||
/**
|
||||
* Initializes a new instance of this class for locating service providers
|
||||
* in a module Layer.
|
||||
* in a module layer.
|
||||
*
|
||||
* @throws ServiceConfigurationError
|
||||
* If {@code svc} is not accessible to {@code caller} or the caller
|
||||
* module does not use the service type.
|
||||
*/
|
||||
private ServiceLoader(Class<?> caller, Layer layer, Class<S> svc) {
|
||||
private ServiceLoader(Class<?> caller, ModuleLayer layer, Class<S> svc) {
|
||||
Objects.requireNonNull(caller);
|
||||
Objects.requireNonNull(layer);
|
||||
Objects.requireNonNull(svc);
|
||||
@ -512,12 +507,15 @@ public final class ServiceLoader<S>
|
||||
|
||||
/**
|
||||
* Checks that the given service type is accessible to types in the given
|
||||
* module, and check that the module declare that it uses the service type. ??
|
||||
* module, and check that the module declares that it uses the service type.
|
||||
*/
|
||||
private static void checkCaller(Class<?> caller, Class<?> svc) {
|
||||
Module callerModule = caller.getModule();
|
||||
if (caller == null) {
|
||||
fail(svc, "no caller to check if it declares `uses`");
|
||||
}
|
||||
|
||||
// Check access to the service type
|
||||
Module callerModule = caller.getModule();
|
||||
int mods = svc.getModifiers();
|
||||
if (!Reflection.verifyMemberAccess(caller, svc, null, mods)) {
|
||||
fail(svc, "service type not accessible to " + callerModule);
|
||||
@ -826,13 +824,13 @@ public final class ServiceLoader<S>
|
||||
|
||||
/**
|
||||
* Implements lazy service provider lookup of service providers that
|
||||
* are provided by modules in a module Layer (or parent layers)
|
||||
* are provided by modules in a module layer (or parent layers)
|
||||
*/
|
||||
private final class LayerLookupIterator<T>
|
||||
implements Iterator<Provider<T>>
|
||||
{
|
||||
Deque<Layer> stack = new ArrayDeque<>();
|
||||
Set<Layer> visited = new HashSet<>();
|
||||
Deque<ModuleLayer> stack = new ArrayDeque<>();
|
||||
Set<ModuleLayer> visited = new HashSet<>();
|
||||
Iterator<ServiceProvider> iterator;
|
||||
ServiceProvider next; // next provider to load
|
||||
|
||||
@ -841,8 +839,8 @@ public final class ServiceLoader<S>
|
||||
stack.push(layer);
|
||||
}
|
||||
|
||||
private Iterator<ServiceProvider> providers(Layer layer) {
|
||||
ServicesCatalog catalog = JLRM_ACCESS.getServicesCatalog(layer);
|
||||
private Iterator<ServiceProvider> providers(ModuleLayer layer) {
|
||||
ServicesCatalog catalog = LANG_ACCESS.getServicesCatalog(layer);
|
||||
return catalog.findServices(serviceName).iterator();
|
||||
}
|
||||
|
||||
@ -864,10 +862,10 @@ public final class ServiceLoader<S>
|
||||
if (stack.isEmpty())
|
||||
return false;
|
||||
|
||||
Layer layer = stack.pop();
|
||||
List<Layer> parents = layer.parents();
|
||||
ModuleLayer layer = stack.pop();
|
||||
List<ModuleLayer> parents = layer.parents();
|
||||
for (int i = parents.size() - 1; i >= 0; i--) {
|
||||
Layer parent = parents.get(i);
|
||||
ModuleLayer parent = parents.get(i);
|
||||
if (!visited.contains(parent)) {
|
||||
visited.add(parent);
|
||||
stack.push(parent);
|
||||
@ -915,8 +913,8 @@ public final class ServiceLoader<S>
|
||||
* Returns iterator to iterate over the implementations of {@code
|
||||
* service} in the given layer.
|
||||
*/
|
||||
private List<ServiceProvider> providers(Layer layer) {
|
||||
ServicesCatalog catalog = JLRM_ACCESS.getServicesCatalog(layer);
|
||||
private List<ServiceProvider> providers(ModuleLayer layer) {
|
||||
ServicesCatalog catalog = LANG_ACCESS.getServicesCatalog(layer);
|
||||
return catalog.findServices(serviceName);
|
||||
}
|
||||
|
||||
@ -946,10 +944,10 @@ public final class ServiceLoader<S>
|
||||
return providers.iterator();
|
||||
} else {
|
||||
List<ServiceProvider> allProviders = new ArrayList<>(providers);
|
||||
Layer bootLayer = Layer.boot();
|
||||
Iterator<Layer> iterator = JLRM_ACCESS.layers(loader).iterator();
|
||||
ModuleLayer bootLayer = ModuleLayer.boot();
|
||||
Iterator<ModuleLayer> iterator = LANG_ACCESS.layers(loader).iterator();
|
||||
while (iterator.hasNext()) {
|
||||
Layer layer = iterator.next();
|
||||
ModuleLayer layer = iterator.next();
|
||||
if (layer != bootLayer) {
|
||||
allProviders.addAll(providers(layer));
|
||||
}
|
||||
@ -1535,7 +1533,7 @@ public final class ServiceLoader<S>
|
||||
|
||||
/**
|
||||
* Creates a new service loader for the given service type that loads
|
||||
* service providers from modules in the given {@code Layer} and its
|
||||
* service providers from modules in the given {@code ModuleLayer} and its
|
||||
* ancestors.
|
||||
*
|
||||
* @apiNote Unlike the other load methods defined here, the service type
|
||||
@ -1545,7 +1543,7 @@ public final class ServiceLoader<S>
|
||||
* @param <S> the class of the service type
|
||||
*
|
||||
* @param layer
|
||||
* The module Layer
|
||||
* The module layer
|
||||
*
|
||||
* @param service
|
||||
* The interface or abstract class representing the service
|
||||
@ -1561,7 +1559,7 @@ public final class ServiceLoader<S>
|
||||
* @spec JPMS
|
||||
*/
|
||||
@CallerSensitive
|
||||
public static <S> ServiceLoader<S> load(Layer layer, Class<S> service) {
|
||||
public static <S> ServiceLoader<S> load(ModuleLayer layer, Class<S> service) {
|
||||
return new ServiceLoader<>(Reflection.getCallerClass(), layer, service);
|
||||
}
|
||||
|
||||
|
@ -31,7 +31,6 @@ import jdk.internal.misc.SharedSecrets;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.UncheckedIOException;
|
||||
import java.lang.reflect.Module;
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
import java.util.Locale;
|
||||
|
@ -25,7 +25,6 @@
|
||||
|
||||
package javax.crypto;
|
||||
|
||||
import java.lang.reflect.Module;
|
||||
import java.security.*;
|
||||
import java.net.*;
|
||||
import java.util.*;
|
||||
|
@ -27,8 +27,6 @@ package jdk.internal.loader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.lang.module.ModuleReference;
|
||||
import java.lang.reflect.Layer;
|
||||
import java.lang.reflect.Module;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URI;
|
||||
import java.net.URL;
|
||||
@ -62,8 +60,7 @@ public class BootLoader {
|
||||
private static final String JAVA_HOME = System.getProperty("java.home");
|
||||
|
||||
static {
|
||||
UNNAMED_MODULE
|
||||
= SharedSecrets.getJavaLangReflectModuleAccess().defineUnnamedModule(null);
|
||||
UNNAMED_MODULE = SharedSecrets.getJavaLangAccess().defineUnnamedModule(null);
|
||||
setBootLoaderUnnamedModule0(UNNAMED_MODULE);
|
||||
}
|
||||
|
||||
@ -255,7 +252,7 @@ public class BootLoader {
|
||||
|
||||
if (mn != null) {
|
||||
// named module from runtime image or exploded module
|
||||
Optional<Module> om = Layer.boot().findModule(mn);
|
||||
Optional<Module> om = ModuleLayer.boot().findModule(mn);
|
||||
if (!om.isPresent())
|
||||
throw new InternalError(mn + " not in boot layer");
|
||||
return om.get();
|
||||
|
@ -27,7 +27,6 @@ package jdk.internal.loader;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Module;
|
||||
import java.net.URL;
|
||||
import java.nio.file.InvalidPathException;
|
||||
import java.nio.file.Paths;
|
||||
|
@ -33,7 +33,6 @@ import java.lang.module.ModuleDescriptor;
|
||||
import java.lang.module.ModuleReader;
|
||||
import java.lang.module.ModuleReference;
|
||||
import java.lang.module.ResolvedModule;
|
||||
import java.lang.reflect.Layer;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URI;
|
||||
import java.net.URL;
|
||||
@ -80,8 +79,8 @@ import jdk.internal.module.Resources;
|
||||
* loader. This allows automatic modules (for example) to link to types in the
|
||||
* unnamed module of the parent class loader.
|
||||
*
|
||||
* @see Layer#defineModulesWithOneLoader
|
||||
* @see Layer#defineModulesWithManyLoaders
|
||||
* @see ModuleModuleLayer#defineModulesWithOneLoader
|
||||
* @see ModuleModuleLayer#defineModulesWithManyLoaders
|
||||
*/
|
||||
|
||||
public final class Loader extends SecureClassLoader {
|
||||
@ -207,10 +206,10 @@ public final class Loader extends SecureClassLoader {
|
||||
* @param cf the Configuration containing at least modules to be defined to
|
||||
* this class loader
|
||||
*
|
||||
* @param parentLayers the parent Layers
|
||||
* @param parentModuleLayers the parent ModuleLayers
|
||||
*/
|
||||
public Loader initRemotePackageMap(Configuration cf,
|
||||
List<Layer> parentLayers)
|
||||
List<ModuleLayer> parentModuleLayers)
|
||||
{
|
||||
for (String name : nameToModule.keySet()) {
|
||||
ResolvedModule resolvedModule = cf.findModule(name).get();
|
||||
@ -236,8 +235,8 @@ public final class Loader extends SecureClassLoader {
|
||||
} else {
|
||||
|
||||
// find the layer for the target module
|
||||
Layer layer = parentLayers.stream()
|
||||
.map(parent -> findLayer(parent, other.configuration()))
|
||||
ModuleLayer layer = parentModuleLayers.stream()
|
||||
.map(parent -> findModuleLayer(parent, other.configuration()))
|
||||
.flatMap(Optional::stream)
|
||||
.findAny()
|
||||
.orElseThrow(() ->
|
||||
@ -286,8 +285,8 @@ public final class Loader extends SecureClassLoader {
|
||||
* Find the layer corresponding to the given configuration in the tree
|
||||
* of layers rooted at the given parent.
|
||||
*/
|
||||
private Optional<Layer> findLayer(Layer parent, Configuration cf) {
|
||||
return SharedSecrets.getJavaLangReflectModuleAccess().layers(parent)
|
||||
private Optional<ModuleLayer> findModuleLayer(ModuleLayer parent, Configuration cf) {
|
||||
return SharedSecrets.getJavaLangAccess().layers(parent)
|
||||
.filter(l -> l.configuration() == cf)
|
||||
.findAny();
|
||||
}
|
||||
|
@ -27,7 +27,6 @@ package jdk.internal.loader;
|
||||
|
||||
import java.lang.module.Configuration;
|
||||
import java.lang.module.ResolvedModule;
|
||||
import java.lang.reflect.Layer;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@ -36,7 +35,7 @@ import java.util.stream.Stream;
|
||||
/**
|
||||
* A pool of class loaders.
|
||||
*
|
||||
* @see Layer#defineModulesWithManyLoaders
|
||||
* @see ModuleLayer#defineModulesWithManyLoaders
|
||||
*/
|
||||
|
||||
public final class LoaderPool {
|
||||
@ -51,7 +50,7 @@ public final class LoaderPool {
|
||||
* created with the given parent class loader as its parent.
|
||||
*/
|
||||
public LoaderPool(Configuration cf,
|
||||
List<Layer> parentLayers,
|
||||
List<ModuleLayer> parentLayers,
|
||||
ClassLoader parentLoader)
|
||||
{
|
||||
Map<String, Loader> loaders = new HashMap<>();
|
||||
|
@ -34,7 +34,6 @@ import java.util.Objects;
|
||||
import java.lang.System.LoggerFinder;
|
||||
import java.lang.System.Logger;
|
||||
import java.lang.ref.ReferenceQueue;
|
||||
import java.lang.reflect.Module;
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
import java.util.Collection;
|
||||
|
@ -31,7 +31,6 @@ import java.util.function.BiFunction;
|
||||
import java.lang.System.LoggerFinder;
|
||||
import java.lang.System.Logger;
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.lang.reflect.Module;
|
||||
import java.util.Objects;
|
||||
import jdk.internal.misc.VM;
|
||||
import sun.util.logging.PlatformLogger;
|
||||
@ -402,10 +401,10 @@ public final class LazyLoggers {
|
||||
* @param module The module on behalf of which the logger is created.
|
||||
* If the module is not loaded from the Boot ClassLoader,
|
||||
* the LoggerFinder is accessed and the logger returned
|
||||
* by {@link LoggerFinder#getLogger(java.lang.String, java.lang.reflect.Module)}
|
||||
* by {@link LoggerFinder#getLogger(java.lang.String, java.lang.Module)}
|
||||
* is returned to the caller directly.
|
||||
* Otherwise, the logger returned by
|
||||
* {@link #getLazyLogger(java.lang.String, java.lang.reflect.Module)}
|
||||
* {@link #getLazyLogger(java.lang.String, java.lang.Module)}
|
||||
* is returned to the caller.
|
||||
*
|
||||
* @return a (possibly lazy) Logger instance.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -27,10 +27,10 @@ package jdk.internal.misc;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.lang.module.ModuleDescriptor;
|
||||
import java.lang.reflect.Executable;
|
||||
import java.lang.reflect.Layer;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Module;
|
||||
import java.net.URI;
|
||||
import java.net.URL;
|
||||
import java.security.AccessControlContext;
|
||||
import java.security.ProtectionDomain;
|
||||
@ -38,6 +38,7 @@ import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import jdk.internal.module.ServicesCatalog;
|
||||
import jdk.internal.reflect.ConstantPool;
|
||||
import sun.reflect.annotation.AnnotationType;
|
||||
import sun.nio.ch.Interruptible;
|
||||
@ -139,11 +140,6 @@ public interface JavaLangAccess {
|
||||
*/
|
||||
void invokeFinalize(Object o) throws Throwable;
|
||||
|
||||
/**
|
||||
* Returns the boot Layer
|
||||
*/
|
||||
Layer getBootLayer();
|
||||
|
||||
/**
|
||||
* Returns the ConcurrentHashMap used as a storage for ClassLoaderValue(s)
|
||||
* associated with the given class loader, creating it if it doesn't already exist.
|
||||
@ -185,4 +181,74 @@ public interface JavaLangAccess {
|
||||
* Invalidate package access cache
|
||||
*/
|
||||
void invalidatePackageAccessCache();
|
||||
|
||||
/**
|
||||
* Defines a new module to the Java virtual machine. The module
|
||||
* is defined to the given class loader.
|
||||
*
|
||||
* The URI is for information purposes only, it can be {@code null}.
|
||||
*/
|
||||
Module defineModule(ClassLoader loader, ModuleDescriptor descriptor, URI uri);
|
||||
|
||||
/**
|
||||
* Defines the unnamed module for the given class loader.
|
||||
*/
|
||||
Module defineUnnamedModule(ClassLoader loader);
|
||||
|
||||
/**
|
||||
* Updates the readability so that module m1 reads m2. The new read edge
|
||||
* does not result in a strong reference to m2 (m2 can be GC'ed).
|
||||
*
|
||||
* This method is the same as m1.addReads(m2) but without a permission check.
|
||||
*/
|
||||
void addReads(Module m1, Module m2);
|
||||
|
||||
/**
|
||||
* Updates module m to read all unnamed modules.
|
||||
*/
|
||||
void addReadsAllUnnamed(Module m);
|
||||
|
||||
/**
|
||||
* Updates module m1 to export a package to module m2. The export does
|
||||
* not result in a strong reference to m2 (m2 can be GC'ed).
|
||||
*/
|
||||
void addExports(Module m1, String pkg, Module m2);
|
||||
|
||||
/**
|
||||
* Updates a module m to export a package to all unnamed modules.
|
||||
*/
|
||||
void addExportsToAllUnnamed(Module m, String pkg);
|
||||
|
||||
/**
|
||||
* Updates module m1 to open a package to module m2. Opening the
|
||||
* package does not result in a strong reference to m2 (m2 can be GC'ed).
|
||||
*/
|
||||
void addOpens(Module m1, String pkg, Module m2);
|
||||
|
||||
/**
|
||||
* Updates a module m to open a package to all unnamed modules.
|
||||
*/
|
||||
void addOpensToAllUnnamed(Module m, String pkg);
|
||||
|
||||
/**
|
||||
* Updates a module m to use a service.
|
||||
*/
|
||||
void addUses(Module m, Class<?> service);
|
||||
|
||||
/**
|
||||
* Returns the ServicesCatalog for the given Layer.
|
||||
*/
|
||||
ServicesCatalog getServicesCatalog(ModuleLayer layer);
|
||||
|
||||
/**
|
||||
* Returns an ordered stream of layers. The first element is is the
|
||||
* given layer, the remaining elements are its parents, in DFS order.
|
||||
*/
|
||||
Stream<ModuleLayer> layers(ModuleLayer layer);
|
||||
|
||||
/**
|
||||
* Returns a stream of the layers that have modules defined to the
|
||||
* given class loader.
|
||||
*/
|
||||
Stream<ModuleLayer> layers(ClassLoader loader);
|
||||
}
|
||||
|
@ -1,121 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package jdk.internal.misc;
|
||||
|
||||
import java.lang.module.ModuleDescriptor;
|
||||
import java.lang.reflect.Layer;
|
||||
import java.lang.reflect.Module;
|
||||
import java.net.URI;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import jdk.internal.module.ServicesCatalog;
|
||||
|
||||
/**
|
||||
* Provides access to non-public methods in java.lang.reflect.Module
|
||||
*/
|
||||
|
||||
public interface JavaLangReflectModuleAccess {
|
||||
|
||||
/**
|
||||
* Defines the unnamed module for the given class loader.
|
||||
*/
|
||||
Module defineUnnamedModule(ClassLoader loader);
|
||||
|
||||
/**
|
||||
* Defines a new module to the Java virtual machine. The module
|
||||
* is defined to the given class loader.
|
||||
*
|
||||
* The URI is for information purposes only, it can be {@code null}.
|
||||
*/
|
||||
Module defineModule(ClassLoader loader, ModuleDescriptor descriptor, URI uri);
|
||||
|
||||
/**
|
||||
* Updates the readability so that module m1 reads m2. The new read edge
|
||||
* does not result in a strong reference to m2 (m2 can be GC'ed).
|
||||
*
|
||||
* This method is the same as m1.addReads(m2) but without a permission check.
|
||||
*/
|
||||
void addReads(Module m1, Module m2);
|
||||
|
||||
/**
|
||||
* Updates module m to read all unnamed modules.
|
||||
*/
|
||||
void addReadsAllUnnamed(Module m);
|
||||
|
||||
/**
|
||||
* Update module m to export a package to all modules.
|
||||
*/
|
||||
void addExports(Module m, String pn);
|
||||
|
||||
/**
|
||||
* Updates module m1 to export a package to module m2. The export does
|
||||
* not result in a strong reference to m2 (m2 can be GC'ed).
|
||||
*/
|
||||
void addExports(Module m1, String pkg, Module m2);
|
||||
|
||||
/**
|
||||
* Updates a module m to export a package to all unnamed modules.
|
||||
*/
|
||||
void addExportsToAllUnnamed(Module m, String pkg);
|
||||
|
||||
/**
|
||||
* Updates a module m to open a package to all modules.
|
||||
*/
|
||||
void addOpens(Module m, String pkg);
|
||||
|
||||
/**
|
||||
* Updates module m1 to open a package to module m2. Opening the
|
||||
* package does not result in a strong reference to m2 (m2 can be GC'ed).
|
||||
*/
|
||||
void addOpens(Module m1, String pkg, Module m2);
|
||||
|
||||
/**
|
||||
* Updates a module m to open a package to all unnamed modules.
|
||||
*/
|
||||
void addOpensToAllUnnamed(Module m, String pkg);
|
||||
|
||||
/**
|
||||
* Updates a module m to use a service.
|
||||
*/
|
||||
void addUses(Module m, Class<?> service);
|
||||
|
||||
/**
|
||||
* Returns the ServicesCatalog for the given Layer.
|
||||
*/
|
||||
ServicesCatalog getServicesCatalog(Layer layer);
|
||||
|
||||
/**
|
||||
* Returns an ordered stream of layers. The first element is is the
|
||||
* given layer, the remaining elements are its parents, in DFS order.
|
||||
*/
|
||||
Stream<Layer> layers(Layer layer);
|
||||
|
||||
/**
|
||||
* Returns a stream of the layers that have modules defined to the
|
||||
* given class loader.
|
||||
*/
|
||||
Stream<Layer> layers(ClassLoader loader);
|
||||
}
|
@ -25,7 +25,6 @@
|
||||
|
||||
package jdk.internal.misc;
|
||||
|
||||
import java.lang.reflect.Module;
|
||||
import java.util.Locale;
|
||||
import java.util.ResourceBundle;
|
||||
|
||||
|
@ -50,7 +50,6 @@ public class SharedSecrets {
|
||||
private static JavaUtilJarAccess javaUtilJarAccess;
|
||||
private static JavaLangAccess javaLangAccess;
|
||||
private static JavaLangModuleAccess javaLangModuleAccess;
|
||||
private static JavaLangReflectModuleAccess javaLangReflectModuleAccess;
|
||||
private static JavaLangInvokeAccess javaLangInvokeAccess;
|
||||
private static JavaLangRefAccess javaLangRefAccess;
|
||||
private static JavaIOAccess javaIOAccess;
|
||||
@ -119,16 +118,6 @@ public class SharedSecrets {
|
||||
return javaLangModuleAccess;
|
||||
}
|
||||
|
||||
public static void setJavaLangReflectModuleAccess(JavaLangReflectModuleAccess jlrma) {
|
||||
javaLangReflectModuleAccess = jlrma;
|
||||
}
|
||||
|
||||
public static JavaLangReflectModuleAccess getJavaLangReflectModuleAccess() {
|
||||
if (javaLangReflectModuleAccess == null)
|
||||
unsafe.ensureClassInitialized(java.lang.reflect.Module.class);
|
||||
return javaLangReflectModuleAccess;
|
||||
}
|
||||
|
||||
public static void setJavaLangRefAccess(JavaLangRefAccess jlra) {
|
||||
javaLangRefAccess = jlra;
|
||||
}
|
||||
|
@ -27,7 +27,6 @@ package jdk.internal.module;
|
||||
|
||||
import java.io.PrintStream;
|
||||
import java.lang.invoke.MethodHandles;
|
||||
import java.lang.reflect.Module;
|
||||
import java.net.URL;
|
||||
import java.security.AccessController;
|
||||
import java.security.CodeSource;
|
||||
|
@ -32,9 +32,6 @@ import java.lang.module.ModuleDescriptor;
|
||||
import java.lang.module.ModuleFinder;
|
||||
import java.lang.module.ModuleReference;
|
||||
import java.lang.module.ResolvedModule;
|
||||
import java.lang.reflect.Layer;
|
||||
import java.lang.reflect.LayerInstantiationException;
|
||||
import java.lang.reflect.Module;
|
||||
import java.net.URI;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
@ -61,7 +58,7 @@ import jdk.internal.perf.PerfCounter;
|
||||
* resolving a set of module names specified via the launcher (or equivalent)
|
||||
* -m and --add-modules options. The modules are located on a module path that
|
||||
* is constructed from the upgrade module path, system modules, and application
|
||||
* module path. The Configuration is instantiated as the boot Layer with each
|
||||
* module path. The Configuration is instantiated as the boot layer with each
|
||||
* module in the the configuration defined to one of the built-in class loaders.
|
||||
*/
|
||||
|
||||
@ -106,11 +103,11 @@ public final class ModuleBootstrap {
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize the module system, returning the boot Layer.
|
||||
* Initialize the module system, returning the boot layer.
|
||||
*
|
||||
* @see java.lang.System#initPhase2()
|
||||
*/
|
||||
public static Layer boot() {
|
||||
public static ModuleLayer boot() {
|
||||
|
||||
long t0 = System.nanoTime();
|
||||
|
||||
@ -237,7 +234,6 @@ public final class ModuleBootstrap {
|
||||
ModuleFinder f = finder; // observable modules
|
||||
systemModules.findAll()
|
||||
.stream()
|
||||
.filter(mref -> !ModuleResolution.doNotResolveByDefault(mref))
|
||||
.map(ModuleReference::descriptor)
|
||||
.map(ModuleDescriptor::name)
|
||||
.filter(mn -> f.find(mn).isPresent()) // observable
|
||||
@ -321,8 +317,7 @@ public final class ModuleBootstrap {
|
||||
if (SystemModules.hasSplitPackages() || needPostResolutionChecks) {
|
||||
Map<String, String> packageToModule = new HashMap<>();
|
||||
for (ResolvedModule resolvedModule : cf.modules()) {
|
||||
ModuleDescriptor descriptor =
|
||||
resolvedModule.reference().descriptor();
|
||||
ModuleDescriptor descriptor = resolvedModule.reference().descriptor();
|
||||
String name = descriptor.name();
|
||||
for (String p : descriptor.packages()) {
|
||||
String other = packageToModule.putIfAbsent(p, name);
|
||||
@ -338,7 +333,7 @@ public final class ModuleBootstrap {
|
||||
long t4 = System.nanoTime();
|
||||
|
||||
// define modules to VM/runtime
|
||||
Layer bootLayer = Layer.empty().defineModules(cf, clf);
|
||||
ModuleLayer bootLayer = ModuleLayer.empty().defineModules(cf, clf);
|
||||
|
||||
PerfCounters.layerCreateTime.addElapsedTimeFrom(t4);
|
||||
|
||||
@ -476,7 +471,7 @@ public final class ModuleBootstrap {
|
||||
* Process the --add-reads options to add any additional read edges that
|
||||
* are specified on the command-line.
|
||||
*/
|
||||
private static void addExtraReads(Layer bootLayer) {
|
||||
private static void addExtraReads(ModuleLayer bootLayer) {
|
||||
|
||||
// decode the command line options
|
||||
Map<String, List<String>> map = decode("jdk.module.addreads.");
|
||||
@ -514,7 +509,7 @@ public final class ModuleBootstrap {
|
||||
* Process the --add-exports and --add-opens options to export/open
|
||||
* additional packages specified on the command-line.
|
||||
*/
|
||||
private static void addExtraExportsAndOpens(Layer bootLayer) {
|
||||
private static void addExtraExportsAndOpens(ModuleLayer bootLayer) {
|
||||
// --add-exports
|
||||
String prefix = "jdk.module.addexports.";
|
||||
Map<String, List<String>> extraExports = decode(prefix);
|
||||
@ -548,7 +543,7 @@ public final class ModuleBootstrap {
|
||||
}
|
||||
}
|
||||
|
||||
private static void addExtraExportsOrOpens(Layer bootLayer,
|
||||
private static void addExtraExportsOrOpens(ModuleLayer bootLayer,
|
||||
Map<String, List<String>> map,
|
||||
boolean opens)
|
||||
{
|
||||
|
@ -135,8 +135,9 @@ public final class ModulePatcher {
|
||||
Path top = file;
|
||||
Files.find(top, Integer.MAX_VALUE,
|
||||
((path, attrs) -> attrs.isRegularFile()))
|
||||
.filter(path -> !isAutomatic
|
||||
.filter(path -> (!isAutomatic
|
||||
|| path.toString().endsWith(".class"))
|
||||
&& !isHidden(path))
|
||||
.map(path -> toPackageName(top, path))
|
||||
.filter(Checks::isPackageName)
|
||||
.forEach(packages::add);
|
||||
@ -177,11 +178,13 @@ public final class ModulePatcher {
|
||||
|
||||
ModuleTarget target = null;
|
||||
ModuleHashes recordedHashes = null;
|
||||
ModuleHashes.HashSupplier hasher = null;
|
||||
ModuleResolution mres = null;
|
||||
if (mref instanceof ModuleReferenceImpl) {
|
||||
ModuleReferenceImpl impl = (ModuleReferenceImpl)mref;
|
||||
target = impl.moduleTarget();
|
||||
recordedHashes = impl.recordedHashes();
|
||||
hasher = impl.hasher();
|
||||
mres = impl.moduleResolution();
|
||||
}
|
||||
|
||||
@ -191,7 +194,7 @@ public final class ModulePatcher {
|
||||
this,
|
||||
target,
|
||||
recordedHashes,
|
||||
null,
|
||||
hasher,
|
||||
mres);
|
||||
|
||||
}
|
||||
@ -556,7 +559,7 @@ public final class ModulePatcher {
|
||||
|
||||
|
||||
/**
|
||||
* Derives a package name from a file path to a .class file.
|
||||
* Derives a package name from the file path of an entry in an exploded patch
|
||||
*/
|
||||
private static String toPackageName(Path top, Path file) {
|
||||
Path entry = top.relativize(file);
|
||||
@ -568,6 +571,17 @@ public final class ModulePatcher {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the given file exists and is a hidden file
|
||||
*/
|
||||
private boolean isHidden(Path file) {
|
||||
try {
|
||||
return Files.isHidden(file);
|
||||
} catch (IOException ioe) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Derives a package name from the name of an entry in a JAR file.
|
||||
*/
|
||||
|
@ -547,7 +547,6 @@ public class ModulePath implements ModuleFinder {
|
||||
*/
|
||||
private static class Patterns {
|
||||
static final Pattern DASH_VERSION = Pattern.compile("-(\\d+(\\.|$))");
|
||||
static final Pattern TRAILING_VERSION = Pattern.compile("(\\.|\\d)*$");
|
||||
static final Pattern NON_ALPHANUM = Pattern.compile("[^A-Za-z0-9]");
|
||||
static final Pattern REPEATING_DOTS = Pattern.compile("(\\.)(\\1)+");
|
||||
static final Pattern LEADING_DOTS = Pattern.compile("^\\.");
|
||||
@ -558,9 +557,6 @@ public class ModulePath implements ModuleFinder {
|
||||
* Clean up candidate module name derived from a JAR file name.
|
||||
*/
|
||||
private static String cleanModuleName(String mn) {
|
||||
// drop trailing version from name
|
||||
mn = Patterns.TRAILING_VERSION.matcher(mn).replaceAll("");
|
||||
|
||||
// replace non-alphanumeric
|
||||
mn = Patterns.NON_ALPHANUM.matcher(mn).replaceAll(".");
|
||||
|
||||
@ -630,7 +626,7 @@ public class ModulePath implements ModuleFinder {
|
||||
private Set<String> explodedPackages(Path dir) {
|
||||
try {
|
||||
return Files.find(dir, Integer.MAX_VALUE,
|
||||
((path, attrs) -> attrs.isRegularFile()))
|
||||
((path, attrs) -> attrs.isRegularFile() && !isHidden(path)))
|
||||
.map(path -> dir.relativize(path))
|
||||
.map(this::toPackageName)
|
||||
.flatMap(Optional::stream)
|
||||
@ -726,6 +722,17 @@ public class ModulePath implements ModuleFinder {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the given file exists and is a hidden file
|
||||
*/
|
||||
private boolean isHidden(Path file) {
|
||||
try {
|
||||
return Files.isHidden(file);
|
||||
} catch (IOException ioe) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private static final PerfCounter scanTime
|
||||
= PerfCounter.newPerfCounter("jdk.module.finder.modulepath.scanTime");
|
||||
private static final PerfCounter moduleCount
|
||||
|
@ -26,15 +26,13 @@
|
||||
package jdk.internal.module;
|
||||
|
||||
import java.lang.module.ModuleDescriptor;
|
||||
import java.lang.reflect.Layer;
|
||||
import java.lang.reflect.Module;
|
||||
import java.net.URI;
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
|
||||
import jdk.internal.loader.BootLoader;
|
||||
import jdk.internal.loader.ClassLoaders;
|
||||
import jdk.internal.misc.JavaLangReflectModuleAccess;
|
||||
import jdk.internal.misc.JavaLangAccess;
|
||||
import jdk.internal.misc.SharedSecrets;
|
||||
|
||||
/**
|
||||
@ -51,8 +49,7 @@ import jdk.internal.misc.SharedSecrets;
|
||||
public class Modules {
|
||||
private Modules() { }
|
||||
|
||||
private static final JavaLangReflectModuleAccess JLRMA
|
||||
= SharedSecrets.getJavaLangReflectModuleAccess();
|
||||
private static final JavaLangAccess JLA = SharedSecrets.getJavaLangAccess();
|
||||
|
||||
/**
|
||||
* Creates a new Module. The module has the given ModuleDescriptor and
|
||||
@ -67,7 +64,7 @@ public class Modules {
|
||||
ModuleDescriptor descriptor,
|
||||
URI uri)
|
||||
{
|
||||
return JLRMA.defineModule(loader, descriptor, uri);
|
||||
return JLA.defineModule(loader, descriptor, uri);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -75,23 +72,14 @@ public class Modules {
|
||||
* Same as m1.addReads(m2) but without a caller check.
|
||||
*/
|
||||
public static void addReads(Module m1, Module m2) {
|
||||
JLRMA.addReads(m1, m2);
|
||||
JLA.addReads(m1, m2);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update module m to read all unnamed modules.
|
||||
*/
|
||||
public static void addReadsAllUnnamed(Module m) {
|
||||
JLRMA.addReadsAllUnnamed(m);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update module m to export a package to all modules.
|
||||
*
|
||||
* This method is for intended for use by tests only.
|
||||
*/
|
||||
public static void addExports(Module m, String pn) {
|
||||
JLRMA.addExports(m, pn);
|
||||
JLA.addReadsAllUnnamed(m);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -99,23 +87,14 @@ public class Modules {
|
||||
* Same as m1.addExports(pn, m2) but without a caller check
|
||||
*/
|
||||
public static void addExports(Module m1, String pn, Module m2) {
|
||||
JLRMA.addExports(m1, pn, m2);
|
||||
JLA.addExports(m1, pn, m2);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates module m to export a package to all unnamed modules.
|
||||
*/
|
||||
public static void addExportsToAllUnnamed(Module m, String pn) {
|
||||
JLRMA.addExportsToAllUnnamed(m, pn);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update module m to open a package to all modules.
|
||||
*
|
||||
* This method is for intended for use by tests only.
|
||||
*/
|
||||
public static void addOpens(Module m, String pn) {
|
||||
JLRMA.addOpens(m, pn);
|
||||
JLA.addExportsToAllUnnamed(m, pn);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -123,14 +102,14 @@ public class Modules {
|
||||
* Same as m1.addOpens(pn, m2) but without a caller check.
|
||||
*/
|
||||
public static void addOpens(Module m1, String pn, Module m2) {
|
||||
JLRMA.addOpens(m1, pn, m2);
|
||||
JLA.addOpens(m1, pn, m2);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates module m to open a package to all unnamed modules.
|
||||
*/
|
||||
public static void addOpensToAllUnnamed(Module m, String pn) {
|
||||
JLRMA.addOpensToAllUnnamed(m, pn);
|
||||
JLA.addOpensToAllUnnamed(m, pn);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -138,16 +117,16 @@ public class Modules {
|
||||
* Same as m2.addUses(service) but without a caller check.
|
||||
*/
|
||||
public static void addUses(Module m, Class<?> service) {
|
||||
JLRMA.addUses(m, service);
|
||||
JLA.addUses(m, service);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates module m to provide a service
|
||||
*/
|
||||
public static void addProvides(Module m, Class<?> service, Class<?> impl) {
|
||||
Layer layer = m.getLayer();
|
||||
ModuleLayer layer = m.getLayer();
|
||||
|
||||
if (layer == null || layer == Layer.boot()) {
|
||||
if (layer == null || layer == ModuleLayer.boot()) {
|
||||
// update ClassLoader catalog
|
||||
PrivilegedAction<ClassLoader> pa = m::getClassLoader;
|
||||
ClassLoader loader = AccessController.doPrivileged(pa);
|
||||
@ -162,9 +141,7 @@ public class Modules {
|
||||
|
||||
if (layer != null) {
|
||||
// update Layer catalog
|
||||
SharedSecrets.getJavaLangReflectModuleAccess()
|
||||
.getServicesCatalog(layer)
|
||||
.addProvider(m, service, impl);
|
||||
JLA.getServicesCatalog(layer).addProvider(m, service, impl);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -25,7 +25,6 @@
|
||||
|
||||
package jdk.internal.module;
|
||||
|
||||
import java.lang.reflect.Module;
|
||||
import java.lang.module.ModuleDescriptor;
|
||||
import java.lang.module.ModuleDescriptor.Provides;
|
||||
import java.util.ArrayList;
|
||||
|
@ -27,7 +27,6 @@ package sun.invoke.util;
|
||||
|
||||
import java.lang.reflect.Modifier;
|
||||
import static java.lang.reflect.Modifier.*;
|
||||
import java.lang.reflect.Module;
|
||||
import java.util.Objects;
|
||||
import jdk.internal.reflect.Reflection;
|
||||
|
||||
|
@ -50,10 +50,8 @@ import java.lang.module.ModuleDescriptor.Requires;
|
||||
import java.lang.module.ModuleDescriptor.Exports;
|
||||
import java.lang.module.ModuleDescriptor.Opens;
|
||||
import java.lang.module.ModuleDescriptor.Provides;
|
||||
import java.lang.reflect.Layer;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.lang.reflect.Module;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.net.URI;
|
||||
@ -467,7 +465,7 @@ public final class LauncherHelper {
|
||||
String mn = s[0];
|
||||
String pn = s[1];
|
||||
|
||||
Layer.boot().findModule(mn).ifPresent(m -> {
|
||||
ModuleLayer.boot().findModule(mn).ifPresent(m -> {
|
||||
if (m.getDescriptor().packages().contains(pn)) {
|
||||
if (open) {
|
||||
Modules.addOpensToAllUnnamed(m, pn);
|
||||
@ -564,7 +562,7 @@ public final class LauncherHelper {
|
||||
}
|
||||
|
||||
// main module is in the boot layer
|
||||
Layer layer = Layer.boot();
|
||||
ModuleLayer layer = ModuleLayer.boot();
|
||||
Optional<Module> om = layer.findModule(mainModule);
|
||||
if (!om.isPresent()) {
|
||||
// should not happen
|
||||
@ -854,7 +852,7 @@ public final class LauncherHelper {
|
||||
private static void setFXLaunchParameters(String what, int mode) {
|
||||
|
||||
// find the module with the FX launcher
|
||||
Optional<Module> om = Layer.boot().findModule(JAVAFX_GRAPHICS_MODULE_NAME);
|
||||
Optional<Module> om = ModuleLayer.boot().findModule(JAVAFX_GRAPHICS_MODULE_NAME);
|
||||
if (!om.isPresent()) {
|
||||
abort(null, "java.launcher.cls.error5");
|
||||
}
|
||||
@ -938,8 +936,7 @@ public final class LauncherHelper {
|
||||
* Called by the launcher to list the observable modules.
|
||||
* If called without any sub-options then the output is a simple list of
|
||||
* the modules. If called with sub-options then the sub-options are the
|
||||
* names of the modules to list (-listmods:java.base,java.desktop for
|
||||
* example).
|
||||
* names of the modules to list (e.g. --list-modules java.base,java.desktop)
|
||||
*/
|
||||
static void listModules(boolean printToStderr, String optionFlag)
|
||||
throws IOException, ClassNotFoundException
|
||||
@ -947,89 +944,97 @@ public final class LauncherHelper {
|
||||
initOutput(printToStderr);
|
||||
|
||||
ModuleFinder finder = jdk.internal.module.ModuleBootstrap.finder();
|
||||
|
||||
int colon = optionFlag.indexOf('=');
|
||||
if (colon == -1) {
|
||||
finder.findAll().stream()
|
||||
.sorted(Comparator.comparing(ModuleReference::descriptor))
|
||||
.forEach(md -> {
|
||||
ostream.println(midAndLocation(md.descriptor(),
|
||||
md.location()));
|
||||
});
|
||||
.sorted(Comparator.comparing(ModuleReference::descriptor))
|
||||
.forEach(mref -> describeModule(finder, mref, false));
|
||||
} else {
|
||||
String[] names = optionFlag.substring(colon+1).split(",");
|
||||
for (String name: names) {
|
||||
ModuleReference mref = finder.find(name).orElse(null);
|
||||
if (mref == null) {
|
||||
System.err.format("%s not observable!%n", name);
|
||||
System.err.format("%s not found%n", name);
|
||||
continue;
|
||||
}
|
||||
|
||||
ModuleDescriptor md = mref.descriptor();
|
||||
if (md.isOpen())
|
||||
ostream.print("open ");
|
||||
if (md.isAutomatic())
|
||||
ostream.print("automatic ");
|
||||
if (md.modifiers().contains(ModuleDescriptor.Modifier.SYNTHETIC))
|
||||
ostream.print("synthetic ");
|
||||
if (md.modifiers().contains(ModuleDescriptor.Modifier.MANDATED))
|
||||
ostream.print("mandated ");
|
||||
ostream.println("module " + midAndLocation(md, mref.location()));
|
||||
|
||||
// unqualified exports (sorted by package)
|
||||
Set<Exports> exports = new TreeSet<>(Comparator.comparing(Exports::source));
|
||||
md.exports().stream().filter(e -> !e.isQualified()).forEach(exports::add);
|
||||
for (Exports e : exports) {
|
||||
String modsAndSource = Stream.concat(toStringStream(e.modifiers()),
|
||||
Stream.of(e.source()))
|
||||
.collect(Collectors.joining(" "));
|
||||
ostream.format(" exports %s%n", modsAndSource);
|
||||
}
|
||||
|
||||
for (Requires d : md.requires()) {
|
||||
ostream.format(" requires %s%n", d);
|
||||
}
|
||||
for (String s : md.uses()) {
|
||||
ostream.format(" uses %s%n", s);
|
||||
}
|
||||
|
||||
for (Provides ps : md.provides()) {
|
||||
ostream.format(" provides %s with %s%n", ps.service(),
|
||||
ps.providers().stream().collect(Collectors.joining(", ")));
|
||||
}
|
||||
|
||||
// qualified exports
|
||||
for (Exports e : md.exports()) {
|
||||
if (e.isQualified()) {
|
||||
String modsAndSource = Stream.concat(toStringStream(e.modifiers()),
|
||||
Stream.of(e.source()))
|
||||
.collect(Collectors.joining(" "));
|
||||
ostream.format(" exports %s", modsAndSource);
|
||||
formatCommaList(ostream, " to", e.targets());
|
||||
}
|
||||
}
|
||||
|
||||
// open packages
|
||||
for (Opens obj: md.opens()) {
|
||||
String modsAndSource = Stream.concat(toStringStream(obj.modifiers()),
|
||||
Stream.of(obj.source()))
|
||||
.collect(Collectors.joining(" "));
|
||||
ostream.format(" opens %s", modsAndSource);
|
||||
if (obj.isQualified())
|
||||
formatCommaList(ostream, " to", obj.targets());
|
||||
else
|
||||
ostream.println();
|
||||
}
|
||||
|
||||
// non-exported/non-open packages
|
||||
Set<String> concealed = new TreeSet<>(md.packages());
|
||||
md.exports().stream().map(Exports::source).forEach(concealed::remove);
|
||||
md.opens().stream().map(Opens::source).forEach(concealed::remove);
|
||||
concealed.forEach(p -> ostream.format(" contains %s%n", p));
|
||||
describeModule(finder, mref, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Describes the given module.
|
||||
*/
|
||||
static void describeModule(ModuleFinder finder,
|
||||
ModuleReference mref,
|
||||
boolean verbose)
|
||||
{
|
||||
ModuleDescriptor md = mref.descriptor();
|
||||
ostream.print("module " + midAndLocation(md, mref.location()));
|
||||
if (md.isAutomatic())
|
||||
ostream.print(" automatic");
|
||||
ostream.println();
|
||||
|
||||
if (!verbose)
|
||||
return;
|
||||
|
||||
// unqualified exports (sorted by package)
|
||||
Set<Exports> exports = new TreeSet<>(Comparator.comparing(Exports::source));
|
||||
md.exports().stream().filter(e -> !e.isQualified()).forEach(exports::add);
|
||||
for (Exports e : exports) {
|
||||
String modsAndSource = Stream.concat(toStringStream(e.modifiers()),
|
||||
Stream.of(e.source()))
|
||||
.collect(Collectors.joining(" "));
|
||||
ostream.format(" exports %s%n", modsAndSource);
|
||||
}
|
||||
|
||||
for (Requires d : md.requires()) {
|
||||
ostream.format(" requires %s", d);
|
||||
String suffix = finder.find(d.name())
|
||||
.map(ModuleReference::descriptor)
|
||||
.map(any -> any.isAutomatic() ? " automatic" : "")
|
||||
.orElse(" not found");
|
||||
ostream.println(suffix);
|
||||
}
|
||||
for (String s : md.uses()) {
|
||||
ostream.format(" uses %s%n", s);
|
||||
}
|
||||
|
||||
for (Provides ps : md.provides()) {
|
||||
ostream.format(" provides %s with %s%n", ps.service(),
|
||||
ps.providers().stream().collect(Collectors.joining(", ")));
|
||||
}
|
||||
|
||||
// qualified exports
|
||||
for (Exports e : md.exports()) {
|
||||
if (e.isQualified()) {
|
||||
String modsAndSource = Stream.concat(toStringStream(e.modifiers()),
|
||||
Stream.of(e.source()))
|
||||
.collect(Collectors.joining(" "));
|
||||
ostream.format(" exports %s", modsAndSource);
|
||||
formatCommaList(ostream, " to", e.targets());
|
||||
}
|
||||
}
|
||||
|
||||
// open packages
|
||||
for (Opens obj: md.opens()) {
|
||||
String modsAndSource = Stream.concat(toStringStream(obj.modifiers()),
|
||||
Stream.of(obj.source()))
|
||||
.collect(Collectors.joining(" "));
|
||||
ostream.format(" opens %s", modsAndSource);
|
||||
if (obj.isQualified())
|
||||
formatCommaList(ostream, " to", obj.targets());
|
||||
else
|
||||
ostream.println();
|
||||
}
|
||||
|
||||
// non-exported/non-open packages
|
||||
Set<String> concealed = new TreeSet<>(md.packages());
|
||||
md.exports().stream().map(Exports::source).forEach(concealed::remove);
|
||||
md.opens().stream().map(Opens::source).forEach(concealed::remove);
|
||||
concealed.forEach(p -> ostream.format(" contains %s%n", p));
|
||||
}
|
||||
|
||||
static <T> String toString(Set<T> s) {
|
||||
return toStringStream(s).collect(Collectors.joining(" "));
|
||||
}
|
||||
|
@ -25,7 +25,6 @@
|
||||
|
||||
package sun.reflect.misc;
|
||||
|
||||
import java.lang.reflect.Module;
|
||||
import java.io.EOFException;
|
||||
import java.security.AllPermission;
|
||||
import java.security.AccessController;
|
||||
|
@ -29,12 +29,12 @@
|
||||
#include "jni_util.h"
|
||||
#include "jvm.h"
|
||||
|
||||
#include "java_lang_reflect_Module.h"
|
||||
#include "java_lang_Module.h"
|
||||
|
||||
/*
|
||||
* Gets the UTF-8 chars for the string and translates '.' to '/'. Does no
|
||||
* further validation, assumption being that both calling code in
|
||||
* java.lang.reflect.Module and VM will do deeper validation.
|
||||
* java.lang.Module and VM will do deeper validation.
|
||||
*/
|
||||
static char*
|
||||
GetInternalPackageName(JNIEnv *env, jstring pkg, char* buf, jsize buf_size)
|
||||
@ -68,7 +68,7 @@ GetInternalPackageName(JNIEnv *env, jstring pkg, char* buf, jsize buf_size)
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_java_lang_reflect_Module_defineModule0(JNIEnv *env, jclass cls, jobject module,
|
||||
Java_java_lang_Module_defineModule0(JNIEnv *env, jclass cls, jobject module,
|
||||
jboolean is_open, jstring version,
|
||||
jstring location, jobjectArray packages)
|
||||
{
|
||||
@ -109,14 +109,14 @@ Java_java_lang_reflect_Module_defineModule0(JNIEnv *env, jclass cls, jobject mod
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_java_lang_reflect_Module_addReads0(JNIEnv *env, jclass cls, jobject from, jobject to)
|
||||
Java_java_lang_Module_addReads0(JNIEnv *env, jclass cls, jobject from, jobject to)
|
||||
{
|
||||
JVM_AddReadsModule(env, from, to);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_java_lang_reflect_Module_addExports0(JNIEnv *env, jclass cls, jobject from,
|
||||
jstring pkg, jobject to)
|
||||
Java_java_lang_Module_addExports0(JNIEnv *env, jclass cls, jobject from,
|
||||
jstring pkg, jobject to)
|
||||
{
|
||||
char buf[128];
|
||||
char* pkg_name;
|
||||
@ -136,8 +136,8 @@ Java_java_lang_reflect_Module_addExports0(JNIEnv *env, jclass cls, jobject from,
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_java_lang_reflect_Module_addExportsToAll0(JNIEnv *env, jclass cls, jobject from,
|
||||
jstring pkg)
|
||||
Java_java_lang_Module_addExportsToAll0(JNIEnv *env, jclass cls, jobject from,
|
||||
jstring pkg)
|
||||
{
|
||||
char buf[128];
|
||||
char* pkg_name;
|
||||
@ -157,8 +157,8 @@ Java_java_lang_reflect_Module_addExportsToAll0(JNIEnv *env, jclass cls, jobject
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_java_lang_reflect_Module_addExportsToAllUnnamed0(JNIEnv *env, jclass cls,
|
||||
jobject from, jstring pkg)
|
||||
Java_java_lang_Module_addExportsToAllUnnamed0(JNIEnv *env, jclass cls,
|
||||
jobject from, jstring pkg)
|
||||
{
|
||||
char buf[128];
|
||||
char* pkg_name;
|
||||
@ -178,7 +178,7 @@ Java_java_lang_reflect_Module_addExportsToAllUnnamed0(JNIEnv *env, jclass cls,
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_java_lang_reflect_Module_addPackage0(JNIEnv *env, jclass cls, jobject m, jstring pkg)
|
||||
Java_java_lang_Module_addPackage0(JNIEnv *env, jclass cls, jobject m, jstring pkg)
|
||||
{
|
||||
char buf[128];
|
||||
char* pkg_name;
|
||||
|
@ -28,7 +28,6 @@ package javax.imageio.metadata;
|
||||
import org.w3c.dom.Node;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Module;
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
|
||||
|
@ -28,7 +28,6 @@ package javax.imageio.spi;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Module;
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
import java.util.Arrays;
|
||||
|
@ -31,7 +31,6 @@ import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
import java.util.Objects;
|
||||
import javax.swing.event.*;
|
||||
import java.lang.reflect.Module;
|
||||
import java.lang.ref.SoftReference;
|
||||
import java.util.HashMap;
|
||||
|
||||
|
@ -25,7 +25,6 @@
|
||||
|
||||
package java.lang.instrument;
|
||||
|
||||
import java.lang.reflect.Module;
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
import java.security.ProtectionDomain;
|
||||
|
@ -25,7 +25,6 @@
|
||||
|
||||
package java.lang.instrument;
|
||||
|
||||
import java.lang.reflect.Module;
|
||||
import java.security.ProtectionDomain;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@ -346,7 +345,7 @@ public interface Instrumentation {
|
||||
|
||||
|
||||
/**
|
||||
* Determines whether a class is modifiable by
|
||||
* Tests whether a class is modifiable by
|
||||
* {@linkplain #retransformClasses retransformation}
|
||||
* or {@linkplain #redefineClasses redefinition}.
|
||||
* If a class is modifiable then this method returns <code>true</code>.
|
||||
@ -711,8 +710,11 @@ public interface Instrumentation {
|
||||
* {@code extraProvides} map contains a service provider type that
|
||||
* is not a member of the module or an implementation of the service;
|
||||
* or {@code extraProvides} maps a key to an empty list
|
||||
* @throws UnmodifiableModuleException if the module cannot be modified
|
||||
* @throws NullPointerException if any of the arguments are {@code null} or
|
||||
* any of the Sets or Maps contains a {@code null} key or value
|
||||
*
|
||||
* @see #isModifiableModule(Module)
|
||||
* @since 9
|
||||
* @spec JPMS
|
||||
*/
|
||||
@ -722,4 +724,19 @@ public interface Instrumentation {
|
||||
Map<String, Set<Module>> extraOpens,
|
||||
Set<Class<?>> extraUses,
|
||||
Map<Class<?>, List<Class<?>>> extraProvides);
|
||||
|
||||
/**
|
||||
* Tests whether a module can be modified with {@link #redefineModule
|
||||
* redefineModule}. If a module is modifiable then this method returns
|
||||
* {@code true}. If a module is not modifiable then this method returns
|
||||
* {@code false}.
|
||||
*
|
||||
* @param module the module to test if it can be modified
|
||||
* @return {@code true} if the module is modifiable, otherwise {@code false}
|
||||
* @throws NullPointerException if the module is {@code null}
|
||||
*
|
||||
* @since 9
|
||||
* @spec JPMS
|
||||
*/
|
||||
boolean isModifiableModule(Module module);
|
||||
}
|
||||
|
@ -0,0 +1,56 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package java.lang.instrument;
|
||||
|
||||
/**
|
||||
* Thrown to indicate that a module cannot be modified.
|
||||
*
|
||||
* @see Instrumentation#redefineModule
|
||||
* @since 9
|
||||
* @spec JPMS
|
||||
*/
|
||||
|
||||
public class UnmodifiableModuleException extends RuntimeException {
|
||||
private static final long serialVersionUID = 6912511912351080644L;
|
||||
|
||||
/**
|
||||
* Constructs an {@code UnmodifiableModuleException} with no
|
||||
* detail message.
|
||||
*/
|
||||
public UnmodifiableModuleException() {
|
||||
super();
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs an {@code UnmodifiableModuleException} with the
|
||||
* specified detail message.
|
||||
*
|
||||
* @param msg the detail message.
|
||||
*/
|
||||
public UnmodifiableModuleException(String msg) {
|
||||
super(msg);
|
||||
}
|
||||
}
|
@ -23,11 +23,10 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
|
||||
package sun.instrument;
|
||||
|
||||
import java.lang.instrument.UnmodifiableModuleException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Module;
|
||||
import java.lang.reflect.AccessibleObject;
|
||||
import java.lang.instrument.ClassFileTransformer;
|
||||
import java.lang.instrument.ClassDefinition;
|
||||
@ -132,6 +131,13 @@ public class InstrumentationImpl implements Instrumentation {
|
||||
return isModifiableClass0(mNativeAgent, theClass);
|
||||
}
|
||||
|
||||
public boolean isModifiableModule(Module module) {
|
||||
if (module == null) {
|
||||
throw new NullPointerException("'module' is null");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean
|
||||
isRetransformClassesSupported() {
|
||||
// ask lazily since there is some overhead
|
||||
@ -243,6 +249,9 @@ public class InstrumentationImpl implements Instrumentation {
|
||||
if (!module.isNamed())
|
||||
return;
|
||||
|
||||
if (!isModifiableModule(module))
|
||||
throw new UnmodifiableModuleException(module.getName());
|
||||
|
||||
// copy and check reads
|
||||
extraReads = new HashSet<>(extraReads);
|
||||
if (extraReads.contains(null))
|
||||
@ -312,7 +321,7 @@ public class InstrumentationImpl implements Instrumentation {
|
||||
return Collections.emptyMap();
|
||||
|
||||
Map<String, Set<Module>> result = new HashMap<>();
|
||||
Set<String> packages = Set.of(module.getPackages());
|
||||
Set<String> packages = module.getPackages();
|
||||
for (Map.Entry<String, Set<Module>> e : map.entrySet()) {
|
||||
String pkg = e.getKey();
|
||||
if (pkg == null)
|
||||
|
@ -25,10 +25,8 @@
|
||||
|
||||
package sun.instrument;
|
||||
|
||||
|
||||
import java.lang.instrument.Instrumentation;
|
||||
import java.lang.instrument.ClassFileTransformer;
|
||||
import java.lang.reflect.Module;
|
||||
import java.security.ProtectionDomain;
|
||||
|
||||
/*
|
||||
|
@ -66,7 +66,7 @@ typedef struct _JPLISEnvironment JPLISEnvironment;
|
||||
#define JPLIS_INSTRUMENTIMPL_AGENTMAININVOKER_METHODSIGNATURE "(Ljava/lang/String;Ljava/lang/String;)V"
|
||||
#define JPLIS_INSTRUMENTIMPL_TRANSFORM_METHODNAME "transform"
|
||||
#define JPLIS_INSTRUMENTIMPL_TRANSFORM_METHODSIGNATURE \
|
||||
"(Ljava/lang/reflect/Module;Ljava/lang/ClassLoader;Ljava/lang/String;Ljava/lang/Class;Ljava/security/ProtectionDomain;[BZ)[B"
|
||||
"(Ljava/lang/Module;Ljava/lang/ClassLoader;Ljava/lang/String;Ljava/lang/Class;Ljava/security/ProtectionDomain;[BZ)[B"
|
||||
|
||||
|
||||
/*
|
||||
|
@ -24,10 +24,10 @@
|
||||
*/
|
||||
|
||||
package java.util.logging;
|
||||
|
||||
import java.lang.ref.Reference;
|
||||
import java.lang.ref.ReferenceQueue;
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.lang.reflect.Module;
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
import java.util.ArrayList;
|
||||
|
@ -23,7 +23,6 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
|
||||
package java.util.logging;
|
||||
|
||||
import java.io.*;
|
||||
@ -43,7 +42,6 @@ import java.util.stream.Stream;
|
||||
import jdk.internal.misc.JavaAWTAccess;
|
||||
import jdk.internal.misc.SharedSecrets;
|
||||
import sun.util.logging.internal.LoggingProviderImpl;
|
||||
import java.lang.reflect.Module;
|
||||
import static jdk.internal.logger.DefaultLoggerFinder.isSystem;
|
||||
|
||||
/**
|
||||
|
@ -23,11 +23,9 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
|
||||
package java.util.logging;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.lang.reflect.Module;
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
import java.util.ArrayList;
|
||||
|
@ -32,7 +32,6 @@ import java.util.ResourceBundle;
|
||||
import java.util.function.Supplier;
|
||||
import java.lang.System.LoggerFinder;
|
||||
import java.lang.System.Logger;
|
||||
import java.lang.reflect.Module;
|
||||
import java.util.Objects;
|
||||
import java.util.logging.LogManager;
|
||||
import jdk.internal.logger.DefaultLoggerFinder;
|
||||
|
@ -43,7 +43,6 @@ import java.lang.ref.WeakReference;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.InvocationHandler;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Module;
|
||||
import java.lang.reflect.Proxy;
|
||||
import java.net.MalformedURLException;
|
||||
import java.rmi.MarshalledObject;
|
||||
|
@ -28,7 +28,6 @@ package javax.management.remote;
|
||||
import com.sun.jmx.mbeanserver.Util;
|
||||
import java.io.IOException;
|
||||
import java.io.UncheckedIOException;
|
||||
import java.lang.reflect.Module;
|
||||
import java.net.MalformedURLException;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
|
@ -45,7 +45,6 @@ import jdk.internal.misc.SharedSecrets;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import java.lang.reflect.Module;
|
||||
import java.lang.reflect.UndeclaredThrowableException;
|
||||
import java.security.PrivilegedAction;
|
||||
import java.util.Collections;
|
||||
@ -181,8 +180,7 @@ public class ManagementFactoryHelper {
|
||||
return AccessController.doPrivileged(new PrivilegedAction<>() {
|
||||
@Override
|
||||
public Class<?> run() {
|
||||
Optional<Module> logging = java.lang.reflect.Layer.boot()
|
||||
.findModule("java.logging");
|
||||
Optional<Module> logging = ModuleLayer.boot().findModule("java.logging");
|
||||
if (logging.isPresent()) {
|
||||
return Class.forName(logging.get(), className);
|
||||
}
|
||||
|
@ -176,7 +176,7 @@ public final class VersionHelper {
|
||||
InputStream getResourceAsStream(Class<?> c, String name) {
|
||||
PrivilegedAction<InputStream> act = () -> {
|
||||
try {
|
||||
java.lang.reflect.Module m = c.getModule();
|
||||
Module m = c.getModule();
|
||||
return c.getModule().getResourceAsStream(resolveName(c,name));
|
||||
} catch (IOException x) {
|
||||
return null;
|
||||
|
@ -67,11 +67,11 @@ public interface ActivationInstantiator extends Remote {
|
||||
*
|
||||
* <ul><li>The class to be activated and the special activation constructor are both public,
|
||||
* and the class resides in a package that is
|
||||
* {@linkplain java.lang.reflect.Module#isExported(String,java.lang.reflect.Module) exported}
|
||||
* {@linkplain Module#isExported(String,Module) exported}
|
||||
* to at least the {@code java.rmi} module; or
|
||||
*
|
||||
* <li>The class to be activated resides in a package that is
|
||||
* {@linkplain java.lang.reflect.Module#isOpen(String,java.lang.reflect.Module) open}
|
||||
* {@linkplain Module#isOpen(String,Module) open}
|
||||
* to at least the {@code java.rmi} module.
|
||||
* </ul>
|
||||
*
|
||||
|
@ -135,9 +135,9 @@ import sun.rmi.transport.LiveRef;
|
||||
* remote object's class.
|
||||
*
|
||||
* <li>Each remote interface must either be public and reside in a package that is
|
||||
* {@linkplain java.lang.reflect.Module#isExported(String,java.lang.reflect.Module) exported}
|
||||
* {@linkplain Module#isExported(String,Module) exported}
|
||||
* to at least the {@code java.rmi} module, or it must reside in a package that is
|
||||
* {@linkplain java.lang.reflect.Module#isOpen(String,java.lang.reflect.Module) open}
|
||||
* {@linkplain Module#isOpen(String,Module) open}
|
||||
* to at least the {@code java.rmi} module.
|
||||
*
|
||||
* <li>The proxy's invocation handler is a {@link
|
||||
|
@ -1023,7 +1023,7 @@ final class P11KeyStore extends KeyStoreSpi {
|
||||
("trusted certificates may only be set by " +
|
||||
"token initialization application"));
|
||||
}
|
||||
Module module = token.provider.nssModule;
|
||||
Secmod.Module module = token.provider.nssModule;
|
||||
if ((module.type != ModuleType.KEYSTORE) && (module.type != ModuleType.FIPS)) {
|
||||
// XXX allow TRUSTANCHOR module
|
||||
throw new KeyStoreException("Trusted certificates can only be "
|
||||
|
@ -77,7 +77,7 @@ public final class SunPKCS11 extends AuthProvider {
|
||||
|
||||
final boolean removable;
|
||||
|
||||
final Module nssModule;
|
||||
final Secmod.Module nssModule;
|
||||
|
||||
final boolean nssUseSecmodTrust;
|
||||
|
||||
@ -148,7 +148,7 @@ public final class SunPKCS11 extends AuthProvider {
|
||||
|
||||
boolean useSecmod = config.getNssUseSecmod();
|
||||
boolean nssUseSecmodTrust = config.getNssUseSecmodTrust();
|
||||
Module nssModule = null;
|
||||
Secmod.Module nssModule = null;
|
||||
|
||||
//
|
||||
// Initialization via Secmod. The way this works is as follows:
|
||||
@ -217,7 +217,7 @@ public final class SunPKCS11 extends AuthProvider {
|
||||
// XXX which exception to throw
|
||||
throw new ProviderException("Could not initialize NSS", e);
|
||||
}
|
||||
List<Module> modules = secmod.getModules();
|
||||
List<Secmod.Module> modules = secmod.getModules();
|
||||
if (config.getShowInfo()) {
|
||||
System.out.println("NSS modules: " + modules);
|
||||
}
|
||||
@ -258,7 +258,7 @@ public final class SunPKCS11 extends AuthProvider {
|
||||
("Invalid external module: " + moduleName);
|
||||
}
|
||||
int k = 0;
|
||||
for (Module module : modules) {
|
||||
for (Secmod.Module module : modules) {
|
||||
if (module.getType() == ModuleType.EXTERNAL) {
|
||||
if (++k == moduleIndex) {
|
||||
nssModule = module;
|
||||
|
@ -25,7 +25,6 @@
|
||||
|
||||
package sun.tools.common;
|
||||
|
||||
import java.lang.reflect.Module;
|
||||
import java.net.URISyntaxException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
|
@ -29,8 +29,8 @@
|
||||
#include "ModuleReferenceImpl.h"
|
||||
|
||||
|
||||
static jclass jlrM(JNIEnv *env) {
|
||||
return findClass(env, "Ljava/lang/reflect/Module;");
|
||||
static jclass jlM(JNIEnv *env) {
|
||||
return findClass(env, "Ljava/lang/Module;");
|
||||
}
|
||||
|
||||
static jboolean
|
||||
@ -43,7 +43,7 @@ getName(PacketInputStream *in, PacketOutputStream *out)
|
||||
jobject module;
|
||||
|
||||
if (method == NULL) {
|
||||
method = getMethod(env, jlrM(env), "getName", "()Ljava/lang/String;");
|
||||
method = getMethod(env, jlM(env), "getName", "()Ljava/lang/String;");
|
||||
}
|
||||
module = inStream_readModuleRef(getEnv(), in);
|
||||
if (inStream_error(in)) {
|
||||
@ -71,7 +71,7 @@ getClassLoader(PacketInputStream *in, PacketOutputStream *out)
|
||||
jobject module;
|
||||
|
||||
if (method == NULL) {
|
||||
method = getMethod(env, jlrM(env), "getClassLoader", "()Ljava/lang/ClassLoader;");
|
||||
method = getMethod(env, jlM(env), "getClassLoader", "()Ljava/lang/ClassLoader;");
|
||||
}
|
||||
module = inStream_readModuleRef(env, in);
|
||||
if (inStream_error(in)) {
|
||||
|
@ -26,7 +26,6 @@ package jdk.tools.jlink.internal;
|
||||
|
||||
import java.lang.module.Configuration;
|
||||
import java.lang.module.ModuleFinder;
|
||||
import java.lang.reflect.Layer;
|
||||
import java.nio.ByteOrder;
|
||||
import java.nio.file.Path;
|
||||
import java.util.ArrayList;
|
||||
@ -55,10 +54,10 @@ public final class Jlink {
|
||||
* @return A new plugin or null if plugin is unknown.
|
||||
*/
|
||||
public static Plugin newPlugin(String name,
|
||||
Map<String, String> configuration, Layer pluginsLayer) {
|
||||
Map<String, String> configuration, ModuleLayer pluginsLayer) {
|
||||
Objects.requireNonNull(name);
|
||||
Objects.requireNonNull(configuration);
|
||||
pluginsLayer = pluginsLayer == null ? Layer.boot() : pluginsLayer;
|
||||
pluginsLayer = pluginsLayer == null ? ModuleLayer.boot() : pluginsLayer;
|
||||
return PluginRepository.newPlugin(configuration, name, pluginsLayer);
|
||||
}
|
||||
|
||||
@ -330,7 +329,7 @@ public final class Jlink {
|
||||
|
||||
private PluginsConfiguration addAutoEnabledPlugins(PluginsConfiguration pluginsConfig) {
|
||||
List<Plugin> plugins = new ArrayList<>(pluginsConfig.getPlugins());
|
||||
List<Plugin> bootPlugins = PluginRepository.getPlugins(Layer.boot());
|
||||
List<Plugin> bootPlugins = PluginRepository.getPlugins(ModuleLayer.boot());
|
||||
for (Plugin bp : bootPlugins) {
|
||||
if (Utils.isAutoEnabled(bp)) {
|
||||
try {
|
||||
|
@ -24,7 +24,6 @@
|
||||
*/
|
||||
package jdk.tools.jlink.internal;
|
||||
|
||||
import java.lang.reflect.Layer;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
@ -56,7 +55,7 @@ public final class PluginRepository {
|
||||
* @return A provider or null if not found.
|
||||
*/
|
||||
public static Plugin getPlugin(String name,
|
||||
Layer pluginsLayer) {
|
||||
ModuleLayer pluginsLayer) {
|
||||
return getPlugin(Plugin.class, name, pluginsLayer);
|
||||
}
|
||||
|
||||
@ -69,7 +68,7 @@ public final class PluginRepository {
|
||||
* @return A plugin or null if no plugin found.
|
||||
*/
|
||||
public static Plugin newPlugin(Map<String, String> config, String name,
|
||||
Layer pluginsLayer) {
|
||||
ModuleLayer pluginsLayer) {
|
||||
Objects.requireNonNull(name);
|
||||
Objects.requireNonNull(pluginsLayer);
|
||||
Plugin plugin = getPlugin(name, pluginsLayer);
|
||||
@ -107,12 +106,12 @@ public final class PluginRepository {
|
||||
registeredPlugins.remove(name);
|
||||
}
|
||||
|
||||
public static List<Plugin> getPlugins(Layer pluginsLayer) {
|
||||
public static List<Plugin> getPlugins(ModuleLayer pluginsLayer) {
|
||||
return getPlugins(Plugin.class, pluginsLayer);
|
||||
}
|
||||
|
||||
private static <T extends Plugin> T getPlugin(Class<T> clazz, String name,
|
||||
Layer pluginsLayer) {
|
||||
ModuleLayer pluginsLayer) {
|
||||
Objects.requireNonNull(name);
|
||||
Objects.requireNonNull(pluginsLayer);
|
||||
@SuppressWarnings("unchecked")
|
||||
@ -136,7 +135,7 @@ public final class PluginRepository {
|
||||
* @param pluginsLayer
|
||||
* @return The list of plugins.
|
||||
*/
|
||||
private static <T extends Plugin> List<T> getPlugins(Class<T> clazz, Layer pluginsLayer) {
|
||||
private static <T extends Plugin> List<T> getPlugins(Class<T> clazz, ModuleLayer pluginsLayer) {
|
||||
Objects.requireNonNull(pluginsLayer);
|
||||
List<T> factories = new ArrayList<>();
|
||||
try {
|
||||
|
@ -29,7 +29,6 @@ import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
import java.lang.module.Configuration;
|
||||
import java.lang.module.ModuleFinder;
|
||||
import java.lang.reflect.Layer;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
@ -211,7 +210,7 @@ public final class TaskHelper {
|
||||
|
||||
private final class PluginsHelper {
|
||||
|
||||
private Layer pluginsLayer = Layer.boot();
|
||||
private ModuleLayer pluginsLayer = ModuleLayer.boot();
|
||||
private final List<Plugin> plugins;
|
||||
private String lastSorter;
|
||||
private boolean listPlugins;
|
||||
@ -655,7 +654,7 @@ public final class TaskHelper {
|
||||
return defaults;
|
||||
}
|
||||
|
||||
public Layer getPluginsLayer() {
|
||||
public ModuleLayer getPluginsLayer() {
|
||||
return pluginOptions.pluginsLayer;
|
||||
}
|
||||
}
|
||||
@ -725,18 +724,18 @@ public final class TaskHelper {
|
||||
return System.getProperty("java.version");
|
||||
}
|
||||
|
||||
static Layer createPluginsLayer(List<Path> paths) {
|
||||
static ModuleLayer createPluginsLayer(List<Path> paths) {
|
||||
|
||||
Path[] dirs = paths.toArray(new Path[0]);
|
||||
ModuleFinder finder = ModulePath.of(Runtime.version(), true, dirs);
|
||||
Configuration bootConfiguration = Layer.boot().configuration();
|
||||
Configuration bootConfiguration = ModuleLayer.boot().configuration();
|
||||
try {
|
||||
Configuration cf = bootConfiguration
|
||||
.resolveAndBind(ModuleFinder.of(),
|
||||
finder,
|
||||
Collections.emptySet());
|
||||
ClassLoader scl = ClassLoader.getSystemClassLoader();
|
||||
return Layer.boot().defineModulesWithOneLoader(cf, scl);
|
||||
return ModuleLayer.boot().defineModulesWithOneLoader(cf, scl);
|
||||
} catch (Exception ex) {
|
||||
// Malformed plugin modules (e.g.: same package in multiple modules).
|
||||
throw new PluginException("Invalid modules in the plugins path: " + ex);
|
||||
|
@ -24,7 +24,6 @@
|
||||
*/
|
||||
package jdk.tools.jlink.internal;
|
||||
|
||||
import java.lang.reflect.Module;
|
||||
import java.net.URI;
|
||||
import java.nio.file.FileSystem;
|
||||
import java.nio.file.FileSystems;
|
||||
|
@ -27,6 +27,7 @@ package jdk.tools.jlink.internal.plugins;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.UncheckedIOException;
|
||||
import java.lang.module.ModuleDescriptor;
|
||||
import java.util.EnumSet;
|
||||
@ -43,8 +44,6 @@ import jdk.tools.jlink.plugin.ResourcePool;
|
||||
import jdk.tools.jlink.plugin.ResourcePoolBuilder;
|
||||
import jdk.tools.jlink.plugin.ResourcePoolEntry;
|
||||
import jdk.tools.jlink.plugin.ResourcePoolModule;
|
||||
import jdk.tools.jlink.plugin.Plugin.Category;
|
||||
import jdk.tools.jlink.plugin.Plugin.State;
|
||||
import jdk.tools.jlink.plugin.Plugin;
|
||||
|
||||
/**
|
||||
@ -101,9 +100,9 @@ public final class ReleaseInfoPlugin implements Plugin {
|
||||
// --release-info add:build_type=fastdebug,source=openjdk,java_version=9
|
||||
// and put whatever value that was passed in command line.
|
||||
|
||||
config.keySet().stream().
|
||||
filter(s -> !NAME.equals(s)).
|
||||
forEach(s -> release.put(s, config.get(s)));
|
||||
config.keySet().stream()
|
||||
.filter(s -> !NAME.equals(s))
|
||||
.forEach(s -> release.put(s, config.get(s)));
|
||||
}
|
||||
break;
|
||||
|
||||
@ -148,8 +147,8 @@ public final class ReleaseInfoPlugin implements Plugin {
|
||||
|
||||
// put topological sorted module names separated by space
|
||||
release.put("MODULES", new ModuleSorter(in.moduleView())
|
||||
.sorted().map(ResourcePoolModule::name)
|
||||
.collect(Collectors.joining(" ", "\"", "\"")));
|
||||
.sorted().map(ResourcePoolModule::name)
|
||||
.collect(Collectors.joining(" ", "\"", "\"")));
|
||||
|
||||
// create a TOP level ResourcePoolEntry for "release" file.
|
||||
out.add(ResourcePoolEntry.create("/java.base/release",
|
||||
@ -160,11 +159,11 @@ public final class ReleaseInfoPlugin implements Plugin {
|
||||
// Parse version string and return a string that includes only version part
|
||||
// leaving "pre", "build" information. See also: java.lang.Runtime.Version.
|
||||
private static String parseVersion(String str) {
|
||||
return Runtime.Version.parse(str).
|
||||
version().
|
||||
stream().
|
||||
map(Object::toString).
|
||||
collect(Collectors.joining("."));
|
||||
return Runtime.Version.parse(str)
|
||||
.version()
|
||||
.stream()
|
||||
.map(Object::toString)
|
||||
.collect(Collectors.joining("."));
|
||||
}
|
||||
|
||||
private static String quote(String str) {
|
||||
@ -172,14 +171,12 @@ public final class ReleaseInfoPlugin implements Plugin {
|
||||
}
|
||||
|
||||
private byte[] releaseFileContent() {
|
||||
Properties props = new Properties();
|
||||
props.putAll(release);
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
try {
|
||||
props.store(baos, "");
|
||||
return baos.toByteArray();
|
||||
} catch (IOException ex) {
|
||||
throw new UncheckedIOException(ex);
|
||||
try (PrintWriter pw = new PrintWriter(baos)) {
|
||||
release.entrySet().stream()
|
||||
.sorted(Map.Entry.comparingByKey())
|
||||
.forEach(e -> pw.format("%s=%s%n", e.getKey(), e.getValue()));
|
||||
}
|
||||
return baos.toByteArray();
|
||||
}
|
||||
}
|
||||
|
@ -26,8 +26,8 @@ groups=TEST.groups [closed/TEST.groups]
|
||||
# Allow querying of various System properties in @requires clauses
|
||||
requires.properties=sun.arch.data.model java.runtime.name
|
||||
|
||||
# Tests using jtreg 4.2 b05 features
|
||||
requiredVersion=4.2 b05
|
||||
# Tests using jtreg 4.2 b07 features
|
||||
requiredVersion=4.2 b07
|
||||
|
||||
# Path to libraries in the topmost test directory. This is needed so @library
|
||||
# does not need ../../ notation to reach them
|
||||
|
@ -81,7 +81,7 @@ public class SystemTrayIconHelper {
|
||||
try {
|
||||
// sun.lwawt.macosx.CTrayIcon
|
||||
Field f_peer = getField( java.awt.TrayIcon.class, "peer");
|
||||
Method m_addExports = Class.forName("java.awt.Helper").getDeclaredMethod("addExports", String.class, java.lang.reflect.Module.class);
|
||||
Method m_addExports = Class.forName("java.awt.Helper").getDeclaredMethod("addExports", String.class, java.lang.Module.class);
|
||||
m_addExports.invoke(null, "sun.lwawt.macosx", robot.getClass().getModule());
|
||||
|
||||
|
||||
@ -105,7 +105,7 @@ public class SystemTrayIconHelper {
|
||||
} else {
|
||||
try {
|
||||
// sun.awt.X11.XTrayIconPeer
|
||||
Method m_addExports = Class.forName("java.awt.Helper").getDeclaredMethod("addExports", String.class, java.lang.reflect.Module.class);
|
||||
Method m_addExports = Class.forName("java.awt.Helper").getDeclaredMethod("addExports", String.class, java.lang.Module.class);
|
||||
m_addExports.invoke(null, "sun.awt.X11", robot.getClass().getModule());
|
||||
|
||||
Field f_peer = getField(java.awt.TrayIcon.class, "peer");
|
||||
|
@ -22,7 +22,6 @@
|
||||
*/
|
||||
|
||||
package java.awt;
|
||||
import java.lang.reflect.Module;
|
||||
public class Helper {
|
||||
private Helper() { }
|
||||
public static void addExports(String pn, Module target) {
|
||||
|
@ -445,7 +445,7 @@ public final class Util {
|
||||
|
||||
try {
|
||||
final Class _clazz = clazz;
|
||||
Method m_addExports = Class.forName("java.awt.Helper").getDeclaredMethod("addExports", String.class, java.lang.reflect.Module.class);
|
||||
Method m_addExports = Class.forName("java.awt.Helper").getDeclaredMethod("addExports", String.class, java.lang.Module.class);
|
||||
// No MToolkit anymore: nothing to do about it.
|
||||
// We may be called from non-X11 system, and this permission cannot be delegated to a test.
|
||||
m_addExports.invoke(null, "sun.awt.X11", Util.class.getModule());
|
||||
|
@ -31,7 +31,6 @@
|
||||
*/
|
||||
|
||||
import java.awt.Component;
|
||||
import java.lang.reflect.Module;
|
||||
|
||||
import jdk.internal.org.objectweb.asm.ClassWriter;
|
||||
import static jdk.internal.org.objectweb.asm.Opcodes.*;
|
||||
|
@ -23,9 +23,7 @@
|
||||
|
||||
import java.lang.module.Configuration;
|
||||
import java.lang.module.ModuleFinder;
|
||||
import java.lang.reflect.Layer;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Module;
|
||||
import java.net.URL;
|
||||
import java.net.URLClassLoader;
|
||||
import java.nio.file.Path;
|
||||
@ -45,13 +43,13 @@ public class TestLayer {
|
||||
|
||||
ModuleFinder finder = ModuleFinder.of(MODS_DIR);
|
||||
|
||||
Configuration parent = Layer.boot().configuration();
|
||||
Configuration parent = ModuleLayer.boot().configuration();
|
||||
Configuration cf = parent.resolveAndBind(ModuleFinder.of(),
|
||||
finder,
|
||||
modules);
|
||||
|
||||
ClassLoader scl = ClassLoader.getSystemClassLoader();
|
||||
Layer layer = Layer.boot().defineModulesWithManyLoaders(cf, scl);
|
||||
ModuleLayer layer = ModuleLayer.boot().defineModulesWithManyLoaders(cf, scl);
|
||||
|
||||
Module m1 = layer.findModule("m1").get();
|
||||
Module m2 = layer.findModule("m2").get();
|
||||
|
@ -21,13 +21,11 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import java.lang.reflect.Layer;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Module;
|
||||
|
||||
public class TestMain {
|
||||
public static void main(String[] args) throws Exception {
|
||||
Layer boot = Layer.boot();
|
||||
ModuleLayer boot = ModuleLayer.boot();
|
||||
Module m1 = boot.findModule("m1").get();
|
||||
Module m2 = boot.findModule("m2").get();
|
||||
|
||||
|
@ -23,12 +23,9 @@
|
||||
|
||||
package p2.test;
|
||||
|
||||
import java.lang.reflect.Layer;
|
||||
import java.lang.reflect.Module;
|
||||
|
||||
public class Main {
|
||||
public static void main(String... args) throws Exception {
|
||||
Layer boot = Layer.boot();
|
||||
ModuleLayer boot = ModuleLayer.boot();
|
||||
Module m1 = boot.findModule("m1").get();
|
||||
Module m2 = Main.class.getModule();
|
||||
|
||||
|
@ -26,8 +26,6 @@ package p3;
|
||||
import java.io.FilePermission;
|
||||
import java.lang.module.Configuration;
|
||||
import java.lang.module.ModuleFinder;
|
||||
import java.lang.reflect.Layer;
|
||||
import java.lang.reflect.Module;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.security.AccessControlException;
|
||||
@ -47,7 +45,7 @@ public class NoAccess {
|
||||
|
||||
ModuleFinder finder = ModuleFinder.of(Paths.get("mods1"), Paths.get("mods2"));
|
||||
|
||||
Layer bootLayer = Layer.boot();
|
||||
ModuleLayer bootLayer = ModuleLayer.boot();
|
||||
Configuration parent = bootLayer.configuration();
|
||||
|
||||
Configuration cf = parent.resolveAndBind(finder,
|
||||
@ -55,7 +53,7 @@ public class NoAccess {
|
||||
Set.of("m1", "m2"));
|
||||
|
||||
ClassLoader scl = ClassLoader.getSystemClassLoader();
|
||||
Layer layer = bootLayer.defineModulesWithManyLoaders(cf, scl);
|
||||
ModuleLayer layer = bootLayer.defineModulesWithManyLoaders(cf, scl);
|
||||
|
||||
if (sm != null) {
|
||||
System.setSecurityManager(sm);
|
||||
|
@ -23,8 +23,6 @@
|
||||
|
||||
package p3;
|
||||
|
||||
import java.lang.reflect.Layer;
|
||||
import java.lang.reflect.Module;
|
||||
import java.security.AccessControlException;
|
||||
import java.security.Permission;
|
||||
|
||||
@ -37,7 +35,7 @@ public class NoGetClassLoaderAccess {
|
||||
private static final Permission GET_CLASSLOADER_PERMISSION = new RuntimePermission("getClassLoader");
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
Layer boot = Layer.boot();
|
||||
ModuleLayer boot = ModuleLayer.boot();
|
||||
|
||||
System.setSecurityManager(new SecurityManager());
|
||||
Module m1 = boot.findModule("m1").get();
|
||||
|
@ -26,10 +26,8 @@ import java.io.IOException;
|
||||
import java.io.UncheckedIOException;
|
||||
import java.lang.reflect.AccessibleObject;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Module;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.lang.reflect.InaccessibleObjectException;
|
||||
import java.lang.reflect.Layer;
|
||||
import java.lang.reflect.ReflectPermission;
|
||||
import java.net.URI;
|
||||
import java.nio.file.FileSystem;
|
||||
@ -269,7 +267,7 @@ public class FieldSetAccessibleTest {
|
||||
try {
|
||||
return Files.walk(root)
|
||||
.filter(p -> p.getNameCount() > 2)
|
||||
.filter(p -> Layer.boot().findModule(p.getName(1).toString()).isPresent())
|
||||
.filter(p -> ModuleLayer.boot().findModule(p.getName(1).toString()).isPresent())
|
||||
.map(p -> p.subpath(2, p.getNameCount()))
|
||||
.map(p -> p.toString())
|
||||
.filter(s -> s.endsWith(".class") && !s.endsWith("module-info.class"))
|
||||
|
@ -23,7 +23,6 @@
|
||||
|
||||
import java.lang.module.Configuration;
|
||||
import java.lang.module.ResolvedModule;
|
||||
import java.lang.reflect.Layer;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.URL;
|
||||
@ -256,7 +255,7 @@ public class Main {
|
||||
* Returns the directory for the given module (by name).
|
||||
*/
|
||||
static Path directoryFor(String name) {
|
||||
Configuration cf = Layer.boot().configuration();
|
||||
Configuration cf = ModuleLayer.boot().configuration();
|
||||
ResolvedModule resolvedModule = cf.findModule(name).orElse(null);
|
||||
if (resolvedModule == null)
|
||||
throw new RuntimeException("not found: " + name);
|
||||
|
@ -26,7 +26,6 @@ import java.io.InputStream;
|
||||
import java.lang.module.ModuleReader;
|
||||
import java.lang.module.ModuleReference;
|
||||
import java.lang.module.ResolvedModule;
|
||||
import java.lang.reflect.Layer;
|
||||
import java.net.URL;
|
||||
import java.util.Enumeration;
|
||||
|
||||
@ -74,7 +73,7 @@ public class Main {
|
||||
public static void main(String[] args) throws Exception {
|
||||
String mn = args[0];
|
||||
|
||||
ModuleReference mref = Layer.boot()
|
||||
ModuleReference mref = ModuleLayer.boot()
|
||||
.configuration()
|
||||
.findModule(mn)
|
||||
.map(ResolvedModule::reference)
|
||||
|
@ -24,7 +24,6 @@
|
||||
import java.io.InputStream;
|
||||
import java.lang.module.Configuration;
|
||||
import java.lang.module.ResolvedModule;
|
||||
import java.lang.reflect.Layer;
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
import java.nio.file.Files;
|
||||
@ -309,7 +308,7 @@ public class Main {
|
||||
* Returns the directory for the given module (by name).
|
||||
*/
|
||||
static Path directoryFor(String mn) {
|
||||
Configuration cf = Layer.boot().configuration();
|
||||
Configuration cf = ModuleLayer.boot().configuration();
|
||||
ResolvedModule resolvedModule = cf.findModule(mn).orElse(null);
|
||||
if (resolvedModule == null)
|
||||
throw new RuntimeException("not found: " + mn);
|
||||
|
@ -28,16 +28,13 @@
|
||||
* @build BasicLayerTest ModuleUtils
|
||||
* @compile layertest/Test.java
|
||||
* @run testng BasicLayerTest
|
||||
* @summary Basic tests for java.lang.reflect.Layer
|
||||
* @summary Basic tests for java.lang.ModuleLayer
|
||||
*/
|
||||
|
||||
import java.lang.module.Configuration;
|
||||
import java.lang.module.ModuleDescriptor;
|
||||
import java.lang.module.ModuleDescriptor.Requires;
|
||||
import java.lang.module.ModuleFinder;
|
||||
import java.lang.reflect.Layer;
|
||||
import java.lang.reflect.LayerInstantiationException;
|
||||
import java.lang.reflect.Module;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
@ -63,10 +60,10 @@ public class BasicLayerTest {
|
||||
}
|
||||
|
||||
/**
|
||||
* Exercise Layer.empty()
|
||||
* Exercise ModuleLayer.empty()
|
||||
*/
|
||||
public void testEmpty() {
|
||||
Layer emptyLayer = Layer.empty();
|
||||
ModuleLayer emptyLayer = ModuleLayer.empty();
|
||||
|
||||
assertTrue(emptyLayer.parents().isEmpty());
|
||||
|
||||
@ -84,10 +81,10 @@ public class BasicLayerTest {
|
||||
|
||||
|
||||
/**
|
||||
* Exercise Layer.boot()
|
||||
* Exercise ModuleLayer.boot()
|
||||
*/
|
||||
public void testBoot() {
|
||||
Layer bootLayer = Layer.boot();
|
||||
ModuleLayer bootLayer = ModuleLayer.boot();
|
||||
|
||||
// configuration
|
||||
Configuration cf = bootLayer.configuration();
|
||||
@ -114,12 +111,12 @@ public class BasicLayerTest {
|
||||
|
||||
// parents
|
||||
assertTrue(bootLayer.parents().size() == 1);
|
||||
assertTrue(bootLayer.parents().get(0) == Layer.empty());
|
||||
assertTrue(bootLayer.parents().get(0) == ModuleLayer.empty());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Exercise Layer defineModules, created with empty layer as parent
|
||||
* Exercise defineModules, created with empty layer as parent
|
||||
*/
|
||||
public void testLayerOnEmpty() {
|
||||
ModuleDescriptor descriptor1 = newBuilder("m1")
|
||||
@ -148,7 +145,7 @@ public class BasicLayerTest {
|
||||
map.put("m2", loader2);
|
||||
map.put("m3", loader3);
|
||||
|
||||
Layer layer = Layer.empty().defineModules(cf, map::get);
|
||||
ModuleLayer layer = ModuleLayer.empty().defineModules(cf, map::get);
|
||||
|
||||
// configuration
|
||||
assertTrue(layer.configuration() == cf);
|
||||
@ -193,12 +190,12 @@ public class BasicLayerTest {
|
||||
|
||||
// parents
|
||||
assertTrue(layer.parents().size() == 1);
|
||||
assertTrue(layer.parents().get(0) == Layer.empty());
|
||||
assertTrue(layer.parents().get(0) == ModuleLayer.empty());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Exercise Layer defineModules, created with boot layer as parent
|
||||
* Exercise defineModules, created with boot layer as parent
|
||||
*/
|
||||
public void testLayerOnBoot() {
|
||||
ModuleDescriptor descriptor1 = newBuilder("m1")
|
||||
@ -214,12 +211,12 @@ public class BasicLayerTest {
|
||||
ModuleFinder finder
|
||||
= ModuleUtils.finderOf(descriptor1, descriptor2);
|
||||
|
||||
Configuration parent = Layer.boot().configuration();
|
||||
Configuration parent = ModuleLayer.boot().configuration();
|
||||
Configuration cf = resolve(parent, finder, "m1");
|
||||
|
||||
ClassLoader loader = new ClassLoader() { };
|
||||
|
||||
Layer layer = Layer.boot().defineModules(cf, mn -> loader);
|
||||
ModuleLayer layer = ModuleLayer.boot().defineModules(cf, mn -> loader);
|
||||
|
||||
// configuration
|
||||
assertTrue(layer.configuration() == cf);
|
||||
@ -255,12 +252,12 @@ public class BasicLayerTest {
|
||||
|
||||
// parents
|
||||
assertTrue(layer.parents().size() == 1);
|
||||
assertTrue(layer.parents().get(0) == Layer.boot());
|
||||
assertTrue(layer.parents().get(0) == ModuleLayer.boot());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Exercise Layer defineModules with a configuration of two modules that
|
||||
* Exercise defineModules with a configuration of two modules that
|
||||
* have the same module-private package.
|
||||
*/
|
||||
public void testPackageContainedInSelfAndOther() {
|
||||
@ -280,19 +277,19 @@ public class BasicLayerTest {
|
||||
assertTrue(cf.modules().size() == 2);
|
||||
|
||||
// one loader per module, should be okay
|
||||
Layer.empty().defineModules(cf, mn -> new ClassLoader() { });
|
||||
ModuleLayer.empty().defineModules(cf, mn -> new ClassLoader() { });
|
||||
|
||||
// same class loader
|
||||
try {
|
||||
ClassLoader loader = new ClassLoader() { };
|
||||
Layer.empty().defineModules(cf, mn -> loader);
|
||||
ModuleLayer.empty().defineModules(cf, mn -> loader);
|
||||
assertTrue(false);
|
||||
} catch (LayerInstantiationException expected) { }
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Exercise Layer defineModules with a configuration that is a partitioned
|
||||
* Exercise defineModules with a configuration that is a partitioned
|
||||
* graph. The same package is exported in both partitions.
|
||||
*/
|
||||
public void testSameExportInPartitionedGraph() {
|
||||
@ -323,7 +320,7 @@ public class BasicLayerTest {
|
||||
assertTrue(cf.modules().size() == 4);
|
||||
|
||||
// one loader per module
|
||||
Layer.empty().defineModules(cf, mn -> new ClassLoader() { });
|
||||
ModuleLayer.empty().defineModules(cf, mn -> new ClassLoader() { });
|
||||
|
||||
// m1 & m2 in one loader, m3 & m4 in another loader
|
||||
ClassLoader loader1 = new ClassLoader() { };
|
||||
@ -333,19 +330,19 @@ public class BasicLayerTest {
|
||||
map.put("m2", loader1);
|
||||
map.put("m3", loader2);
|
||||
map.put("m4", loader2);
|
||||
Layer.empty().defineModules(cf, map::get);
|
||||
ModuleLayer.empty().defineModules(cf, map::get);
|
||||
|
||||
// same loader
|
||||
try {
|
||||
ClassLoader loader = new ClassLoader() { };
|
||||
Layer.empty().defineModules(cf, mn -> loader);
|
||||
ModuleLayer.empty().defineModules(cf, mn -> loader);
|
||||
assertTrue(false);
|
||||
} catch (LayerInstantiationException expected) { }
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Exercise Layer defineModules with a configuration with a module that
|
||||
* Exercise defineModules with a configuration with a module that
|
||||
* contains a package that is the same name as a non-exported package in
|
||||
* a parent layer.
|
||||
*/
|
||||
@ -362,12 +359,12 @@ public class BasicLayerTest {
|
||||
|
||||
ModuleFinder finder = ModuleUtils.finderOf(descriptor);
|
||||
|
||||
Configuration parent = Layer.boot().configuration();
|
||||
Configuration parent = ModuleLayer.boot().configuration();
|
||||
Configuration cf = parent.resolve(finder, ModuleFinder.of(), Set.of("m1"));
|
||||
assertTrue(cf.modules().size() == 1);
|
||||
|
||||
ClassLoader loader = new ClassLoader() { };
|
||||
Layer layer = Layer.boot().defineModules(cf, mn -> loader);
|
||||
ModuleLayer layer = ModuleLayer.boot().defineModules(cf, mn -> loader);
|
||||
assertTrue(layer.modules().size() == 1);
|
||||
}
|
||||
|
||||
@ -395,7 +392,7 @@ public class BasicLayerTest {
|
||||
Configuration cf1 = resolve(finder1, "m2");
|
||||
|
||||
ClassLoader cl1 = new ClassLoader() { };
|
||||
Layer layer1 = Layer.empty().defineModules(cf1, mn -> cl1);
|
||||
ModuleLayer layer1 = ModuleLayer.empty().defineModules(cf1, mn -> cl1);
|
||||
|
||||
|
||||
// cf2: m3, m3 requires m2
|
||||
@ -409,10 +406,10 @@ public class BasicLayerTest {
|
||||
Configuration cf2 = resolve(cf1, finder2, "m3");
|
||||
|
||||
ClassLoader cl2 = new ClassLoader() { };
|
||||
Layer layer2 = layer1.defineModules(cf2, mn -> cl2);
|
||||
ModuleLayer layer2 = layer1.defineModules(cf2, mn -> cl2);
|
||||
|
||||
assertTrue(layer1.parents().size() == 1);
|
||||
assertTrue(layer1.parents().get(0) == Layer.empty());
|
||||
assertTrue(layer1.parents().get(0) == ModuleLayer.empty());
|
||||
|
||||
assertTrue(layer2.parents().size() == 1);
|
||||
assertTrue(layer2.parents().get(0) == layer1);
|
||||
@ -461,7 +458,7 @@ public class BasicLayerTest {
|
||||
Configuration cf1 = resolve(finder1, "m1");
|
||||
|
||||
ClassLoader cl1 = new ClassLoader() { };
|
||||
Layer layer1 = Layer.empty().defineModules(cf1, mn -> cl1);
|
||||
ModuleLayer layer1 = ModuleLayer.empty().defineModules(cf1, mn -> cl1);
|
||||
|
||||
|
||||
// cf2: m2, m3: m2 requires transitive m1, m3 requires m2
|
||||
@ -479,10 +476,10 @@ public class BasicLayerTest {
|
||||
Configuration cf2 = resolve(cf1, finder2, "m3");
|
||||
|
||||
ClassLoader cl2 = new ClassLoader() { };
|
||||
Layer layer2 = layer1.defineModules(cf2, mn -> cl2);
|
||||
ModuleLayer layer2 = layer1.defineModules(cf2, mn -> cl2);
|
||||
|
||||
assertTrue(layer1.parents().size() == 1);
|
||||
assertTrue(layer1.parents().get(0) == Layer.empty());
|
||||
assertTrue(layer1.parents().get(0) == ModuleLayer.empty());
|
||||
|
||||
assertTrue(layer2.parents().size() == 1);
|
||||
assertTrue(layer2.parents().get(0) == layer1);
|
||||
@ -528,7 +525,7 @@ public class BasicLayerTest {
|
||||
Configuration cf1 = resolve(finder1, "m1");
|
||||
|
||||
ClassLoader cl1 = new ClassLoader() { };
|
||||
Layer layer1 = Layer.empty().defineModules(cf1, mn -> cl1);
|
||||
ModuleLayer layer1 = ModuleLayer.empty().defineModules(cf1, mn -> cl1);
|
||||
|
||||
|
||||
// cf2: m2 requires transitive m1
|
||||
@ -542,7 +539,7 @@ public class BasicLayerTest {
|
||||
Configuration cf2 = resolve(cf1, finder2, "m2");
|
||||
|
||||
ClassLoader cl2 = new ClassLoader() { };
|
||||
Layer layer2 = layer1.defineModules(cf2, mn -> cl2);
|
||||
ModuleLayer layer2 = layer1.defineModules(cf2, mn -> cl2);
|
||||
|
||||
|
||||
// cf3: m3 requires m2
|
||||
@ -556,10 +553,10 @@ public class BasicLayerTest {
|
||||
Configuration cf3 = resolve(cf2, finder3, "m3");
|
||||
|
||||
ClassLoader cl3 = new ClassLoader() { };
|
||||
Layer layer3 = layer2.defineModules(cf3, mn -> cl3);
|
||||
ModuleLayer layer3 = layer2.defineModules(cf3, mn -> cl3);
|
||||
|
||||
assertTrue(layer1.parents().size() == 1);
|
||||
assertTrue(layer1.parents().get(0) == Layer.empty());
|
||||
assertTrue(layer1.parents().get(0) == ModuleLayer.empty());
|
||||
|
||||
assertTrue(layer2.parents().size() == 1);
|
||||
assertTrue(layer2.parents().get(0) == layer1);
|
||||
@ -612,7 +609,7 @@ public class BasicLayerTest {
|
||||
Configuration cf1 = resolve(finder1, "m2");
|
||||
|
||||
ClassLoader cl1 = new ClassLoader() { };
|
||||
Layer layer1 = Layer.empty().defineModules(cf1, mn -> cl1);
|
||||
ModuleLayer layer1 = ModuleLayer.empty().defineModules(cf1, mn -> cl1);
|
||||
|
||||
|
||||
// cf2: m3 requires transitive m2, m4 requires m3
|
||||
@ -631,10 +628,10 @@ public class BasicLayerTest {
|
||||
Configuration cf2 = resolve(cf1, finder2, "m3", "m4");
|
||||
|
||||
ClassLoader cl2 = new ClassLoader() { };
|
||||
Layer layer2 = layer1.defineModules(cf2, mn -> cl2);
|
||||
ModuleLayer layer2 = layer1.defineModules(cf2, mn -> cl2);
|
||||
|
||||
assertTrue(layer1.parents().size() == 1);
|
||||
assertTrue(layer1.parents().get(0) == Layer.empty());
|
||||
assertTrue(layer1.parents().get(0) == ModuleLayer.empty());
|
||||
|
||||
assertTrue(layer2.parents().size() == 1);
|
||||
assertTrue(layer2.parents().get(0) == layer1);
|
||||
@ -691,7 +688,7 @@ public class BasicLayerTest {
|
||||
Configuration cf = resolve(finder1, "m1", "m2");
|
||||
|
||||
ClassLoader cl = new ClassLoader() { };
|
||||
Layer layer = Layer.empty().defineModules(cf, mn -> cl);
|
||||
ModuleLayer layer = ModuleLayer.empty().defineModules(cf, mn -> cl);
|
||||
assertTrue(layer.modules().size() == 2);
|
||||
|
||||
Module m1 = layer.findModule("m1").get();
|
||||
@ -724,7 +721,7 @@ public class BasicLayerTest {
|
||||
|
||||
Configuration cf = resolve(finder1, "m2");
|
||||
ClassLoader cl = new ClassLoader() { };
|
||||
Layer layer = Layer.empty().defineModules(cf, mn -> cl);
|
||||
ModuleLayer layer = ModuleLayer.empty().defineModules(cf, mn -> cl);
|
||||
assertTrue(layer.modules().size() == 2);
|
||||
|
||||
Module m1 = layer.findModule("m1").get();
|
||||
@ -750,7 +747,7 @@ public class BasicLayerTest {
|
||||
ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1);
|
||||
Configuration cf1 = resolve(finder1, "m1");
|
||||
ClassLoader cl1 = new ClassLoader() { };
|
||||
Layer layer1 = Layer.empty().defineModules(cf1, mn -> cl1);
|
||||
ModuleLayer layer1 = ModuleLayer.empty().defineModules(cf1, mn -> cl1);
|
||||
assertTrue(layer1.modules().size() == 1);
|
||||
|
||||
// create layer2 with m2
|
||||
@ -760,7 +757,7 @@ public class BasicLayerTest {
|
||||
ModuleFinder finder2 = ModuleUtils.finderOf(descriptor2);
|
||||
Configuration cf2 = resolve(cf1, finder2, "m2");
|
||||
ClassLoader cl2 = new ClassLoader() { };
|
||||
Layer layer2 = layer1.defineModules(cf2, mn -> cl2);
|
||||
ModuleLayer layer2 = layer1.defineModules(cf2, mn -> cl2);
|
||||
assertTrue(layer2.modules().size() == 1);
|
||||
|
||||
Module m1 = layer1.findModule("m1").get();
|
||||
@ -786,7 +783,7 @@ public class BasicLayerTest {
|
||||
ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1);
|
||||
Configuration cf1 = resolve(finder1, "m1");
|
||||
ClassLoader cl1 = new ClassLoader() { };
|
||||
Layer layer1 = Layer.empty().defineModules(cf1, mn -> cl1);
|
||||
ModuleLayer layer1 = ModuleLayer.empty().defineModules(cf1, mn -> cl1);
|
||||
assertTrue(layer1.modules().size() == 1);
|
||||
|
||||
// create layer2 with m2
|
||||
@ -797,7 +794,7 @@ public class BasicLayerTest {
|
||||
ModuleFinder finder2 = ModuleUtils.finderOf(descriptor2);
|
||||
Configuration cf2 = resolve(cf1, finder2, "m2");
|
||||
ClassLoader cl2 = new ClassLoader() { };
|
||||
Layer layer2 = layer1.defineModules(cf2, mn -> cl2);
|
||||
ModuleLayer layer2 = layer1.defineModules(cf2, mn -> cl2);
|
||||
assertTrue(layer2.modules().size() == 1);
|
||||
|
||||
Module m1 = layer1.findModule("m1").get();
|
||||
@ -822,7 +819,7 @@ public class BasicLayerTest {
|
||||
ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1);
|
||||
Configuration cf1 = resolve(finder1, "m1");
|
||||
ClassLoader cl1 = new ClassLoader() { };
|
||||
Layer layer1 = Layer.empty().defineModules(cf1, mn -> cl1);
|
||||
ModuleLayer layer1 = ModuleLayer.empty().defineModules(cf1, mn -> cl1);
|
||||
assertTrue(layer1.modules().size() == 1);
|
||||
|
||||
// create layer2 with m1 and m2
|
||||
@ -830,7 +827,7 @@ public class BasicLayerTest {
|
||||
ModuleFinder finder2 = ModuleUtils.finderOf(descriptor1, descriptor2);
|
||||
Configuration cf2 = resolve(cf1, finder2, "m1", "m2");
|
||||
ClassLoader cl2 = new ClassLoader() { };
|
||||
Layer layer2 = layer1.defineModules(cf2, mn -> cl2);
|
||||
ModuleLayer layer2 = layer1.defineModules(cf2, mn -> cl2);
|
||||
assertTrue(layer2.modules().size() == 2);
|
||||
|
||||
Module m1_v1 = layer1.findModule("m1").get();
|
||||
@ -860,7 +857,7 @@ public class BasicLayerTest {
|
||||
ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1, descriptor2);
|
||||
Configuration cf1 = resolve(finder1, "m2");
|
||||
ClassLoader loader1 = new ClassLoader() { };
|
||||
Layer layer1 = Layer.empty().defineModules(cf1, mn -> loader1);
|
||||
ModuleLayer layer1 = ModuleLayer.empty().defineModules(cf1, mn -> loader1);
|
||||
assertTrue(layer1.modules().size() == 2);
|
||||
|
||||
// create layer2 with m1 and m3
|
||||
@ -871,7 +868,7 @@ public class BasicLayerTest {
|
||||
ModuleFinder finder2 = ModuleUtils.finderOf(descriptor1, descriptor3);
|
||||
Configuration cf2 = resolve(cf1, finder2, "m1", "m3");
|
||||
ClassLoader loader2 = new ClassLoader() { };
|
||||
Layer layer2 = layer1.defineModules(cf2, mn -> loader2);
|
||||
ModuleLayer layer2 = layer1.defineModules(cf2, mn -> loader2);
|
||||
assertTrue(layer2.modules().size() == 2);
|
||||
|
||||
Module m1_v1 = layer1.findModule("m1").get();
|
||||
@ -902,7 +899,7 @@ public class BasicLayerTest {
|
||||
ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1);
|
||||
Configuration cf1 = resolve(finder1, "m1");
|
||||
ClassLoader cl1 = new ClassLoader() { };
|
||||
Layer layer1 = Layer.empty().defineModules(cf1, mn -> cl1);
|
||||
ModuleLayer layer1 = ModuleLayer.empty().defineModules(cf1, mn -> cl1);
|
||||
assertTrue(layer1.modules().size() == 1);
|
||||
|
||||
// create layer2 with m2
|
||||
@ -912,7 +909,7 @@ public class BasicLayerTest {
|
||||
ModuleFinder finder2 = ModuleUtils.finderOf(descriptor2);
|
||||
Configuration cf2 = resolve(cf1, finder2, "m2");
|
||||
ClassLoader cl2 = new ClassLoader() { };
|
||||
Layer layer2 = layer1.defineModules(cf2, mn -> cl2);
|
||||
ModuleLayer layer2 = layer1.defineModules(cf2, mn -> cl2);
|
||||
assertTrue(layer2.modules().size() == 1);
|
||||
|
||||
Module m1 = layer1.findModule("m1").get();
|
||||
@ -924,9 +921,9 @@ public class BasicLayerTest {
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempt to use Layer defineModules to create a layer with a module
|
||||
* defined to a class loader that already has a module of the same name
|
||||
* defined to the class loader.
|
||||
* Attempt to use defineModules to create a layer with a module defined
|
||||
* to a class loader that already has a module of the same name defined
|
||||
* to the class loader.
|
||||
*/
|
||||
@Test(expectedExceptions = { LayerInstantiationException.class })
|
||||
public void testModuleAlreadyDefinedToLoader() {
|
||||
@ -937,24 +934,24 @@ public class BasicLayerTest {
|
||||
|
||||
ModuleFinder finder = ModuleUtils.finderOf(md);
|
||||
|
||||
Configuration parent = Layer.boot().configuration();
|
||||
Configuration parent = ModuleLayer.boot().configuration();
|
||||
|
||||
Configuration cf = parent.resolve(finder, ModuleFinder.of(), Set.of("m"));
|
||||
|
||||
ClassLoader loader = new ClassLoader() { };
|
||||
|
||||
Layer.boot().defineModules(cf, mn -> loader);
|
||||
ModuleLayer.boot().defineModules(cf, mn -> loader);
|
||||
|
||||
// should throw LayerInstantiationException as m1 already defined to loader
|
||||
Layer.boot().defineModules(cf, mn -> loader);
|
||||
ModuleLayer.boot().defineModules(cf, mn -> loader);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Attempt to use Layer defineModules to create a Layer with a module
|
||||
* containing package {@code p} where the class loader already has a module
|
||||
* defined to it containing package {@code p}.
|
||||
* Attempt to use defineModules to create a layer with a module containing
|
||||
* package {@code p} where the class loader already has a module defined
|
||||
* to it containing package {@code p}.
|
||||
*/
|
||||
@Test(expectedExceptions = { LayerInstantiationException.class })
|
||||
public void testPackageAlreadyInNamedModule() {
|
||||
@ -975,24 +972,24 @@ public class BasicLayerTest {
|
||||
|
||||
// define m1 containing package p to class loader
|
||||
|
||||
Configuration parent = Layer.boot().configuration();
|
||||
Configuration parent = ModuleLayer.boot().configuration();
|
||||
|
||||
Configuration cf1 = parent.resolve(finder, ModuleFinder.of(), Set.of("m1"));
|
||||
|
||||
Layer layer1 = Layer.boot().defineModules(cf1, mn -> loader);
|
||||
ModuleLayer layer1 = ModuleLayer.boot().defineModules(cf1, mn -> loader);
|
||||
|
||||
// attempt to define m2 containing package p to class loader
|
||||
|
||||
Configuration cf2 = parent.resolve(finder, ModuleFinder.of(), Set.of("m2"));
|
||||
|
||||
// should throw exception because p already in m1
|
||||
Layer layer2 = Layer.boot().defineModules(cf2, mn -> loader);
|
||||
ModuleLayer layer2 = ModuleLayer.boot().defineModules(cf2, mn -> loader);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Attempt to use Layer defineModules to create a Layer with a module
|
||||
* Attempt to use defineModules to create a layer with a module
|
||||
* containing a package in which a type is already loaded by the class
|
||||
* loader.
|
||||
*/
|
||||
@ -1009,15 +1006,15 @@ public class BasicLayerTest {
|
||||
|
||||
ModuleFinder finder = ModuleUtils.finderOf(md);
|
||||
|
||||
Configuration parent = Layer.boot().configuration();
|
||||
Configuration parent = ModuleLayer.boot().configuration();
|
||||
Configuration cf = parent.resolve(finder, ModuleFinder.of(), Set.of("m"));
|
||||
|
||||
Layer.boot().defineModules(cf, mn -> c.getClassLoader());
|
||||
ModuleLayer.boot().defineModules(cf, mn -> c.getClassLoader());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Attempt to create a Layer with a module named "java.base".
|
||||
* Attempt to create a layer with a module named "java.base".
|
||||
*/
|
||||
public void testLayerWithJavaBase() {
|
||||
ModuleDescriptor descriptor = newBuilder("java.base")
|
||||
@ -1026,7 +1023,7 @@ public class BasicLayerTest {
|
||||
|
||||
ModuleFinder finder = ModuleUtils.finderOf(descriptor);
|
||||
|
||||
Configuration cf = Layer.boot()
|
||||
Configuration cf = ModuleLayer.boot()
|
||||
.configuration()
|
||||
.resolve(finder, ModuleFinder.of(), Set.of("java.base"));
|
||||
assertTrue(cf.modules().size() == 1);
|
||||
@ -1034,17 +1031,17 @@ public class BasicLayerTest {
|
||||
ClassLoader scl = ClassLoader.getSystemClassLoader();
|
||||
|
||||
try {
|
||||
Layer.boot().defineModules(cf, mn -> new ClassLoader() { });
|
||||
ModuleLayer.boot().defineModules(cf, mn -> new ClassLoader() { });
|
||||
assertTrue(false);
|
||||
} catch (LayerInstantiationException e) { }
|
||||
|
||||
try {
|
||||
Layer.boot().defineModulesWithOneLoader(cf, scl);
|
||||
ModuleLayer.boot().defineModulesWithOneLoader(cf, scl);
|
||||
assertTrue(false);
|
||||
} catch (LayerInstantiationException e) { }
|
||||
|
||||
try {
|
||||
Layer.boot().defineModulesWithManyLoaders(cf, scl);
|
||||
ModuleLayer.boot().defineModulesWithManyLoaders(cf, scl);
|
||||
assertTrue(false);
|
||||
} catch (LayerInstantiationException e) { }
|
||||
}
|
||||
@ -1056,7 +1053,7 @@ public class BasicLayerTest {
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempt to create a Layer with a module containing a "java" package.
|
||||
* Attempt to create a layer with a module containing a "java" package.
|
||||
* This should only be allowed when the module is defined to the platform
|
||||
* class loader.
|
||||
*/
|
||||
@ -1065,7 +1062,7 @@ public class BasicLayerTest {
|
||||
ModuleDescriptor descriptor = newBuilder(mn).packages(Set.of(pn)).build();
|
||||
ModuleFinder finder = ModuleUtils.finderOf(descriptor);
|
||||
|
||||
Configuration cf = Layer.boot()
|
||||
Configuration cf = ModuleLayer.boot()
|
||||
.configuration()
|
||||
.resolve(finder, ModuleFinder.of(), Set.of(mn));
|
||||
assertTrue(cf.modules().size() == 1);
|
||||
@ -1074,33 +1071,33 @@ public class BasicLayerTest {
|
||||
ClassLoader scl = ClassLoader.getSystemClassLoader();
|
||||
|
||||
try {
|
||||
Layer.boot().defineModules(cf, _mn -> new ClassLoader() { });
|
||||
ModuleLayer.boot().defineModules(cf, _mn -> new ClassLoader() { });
|
||||
assertTrue(false);
|
||||
} catch (LayerInstantiationException e) { }
|
||||
|
||||
try {
|
||||
Layer.boot().defineModulesWithOneLoader(cf, scl);
|
||||
ModuleLayer.boot().defineModulesWithOneLoader(cf, scl);
|
||||
assertTrue(false);
|
||||
} catch (LayerInstantiationException e) { }
|
||||
|
||||
try {
|
||||
Layer.boot().defineModulesWithManyLoaders(cf, scl);
|
||||
ModuleLayer.boot().defineModulesWithManyLoaders(cf, scl);
|
||||
assertTrue(false);
|
||||
} catch (LayerInstantiationException e) { }
|
||||
|
||||
// create layer with module defined to platform class loader
|
||||
Layer layer = Layer.boot().defineModules(cf, _mn -> pcl);
|
||||
ModuleLayer layer = ModuleLayer.boot().defineModules(cf, _mn -> pcl);
|
||||
Optional<Module> om = layer.findModule(mn);
|
||||
assertTrue(om.isPresent());
|
||||
Module foo = om.get();
|
||||
assertTrue(foo.getClassLoader() == pcl);
|
||||
assertTrue(foo.getPackages().length == 1);
|
||||
assertTrue(foo.getPackages()[0].equals(pn));
|
||||
assertTrue(foo.getPackages().size() == 1);
|
||||
assertTrue(foo.getPackages().iterator().next().equals(pn));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Attempt to create a Layer with a module defined to the boot loader
|
||||
* Attempt to create a layer with a module defined to the boot loader
|
||||
*/
|
||||
@Test(expectedExceptions = { LayerInstantiationException.class })
|
||||
public void testLayerWithBootLoader() {
|
||||
@ -1109,50 +1106,47 @@ public class BasicLayerTest {
|
||||
|
||||
ModuleFinder finder = ModuleUtils.finderOf(descriptor);
|
||||
|
||||
Configuration cf = Layer.boot()
|
||||
Configuration cf = ModuleLayer.boot()
|
||||
.configuration()
|
||||
.resolve(finder, ModuleFinder.of(), Set.of("m1"));
|
||||
assertTrue(cf.modules().size() == 1);
|
||||
|
||||
Layer.boot().defineModules(cf, mn -> null );
|
||||
ModuleLayer.boot().defineModules(cf, mn -> null );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Parent of configuration != configuration of parent Layer
|
||||
* Parent of configuration != configuration of parent layer
|
||||
*/
|
||||
@Test(expectedExceptions = { IllegalArgumentException.class })
|
||||
public void testIncorrectParent1() {
|
||||
|
||||
ModuleDescriptor descriptor1 = newBuilder("m1")
|
||||
.requires("java.base")
|
||||
.build();
|
||||
|
||||
ModuleFinder finder = ModuleUtils.finderOf(descriptor1);
|
||||
|
||||
Configuration parent = Layer.boot().configuration();
|
||||
Configuration parent = ModuleLayer.boot().configuration();
|
||||
Configuration cf = parent.resolve(finder, ModuleFinder.of(), Set.of("m1"));
|
||||
|
||||
ClassLoader loader = new ClassLoader() { };
|
||||
Layer.empty().defineModules(cf, mn -> loader);
|
||||
ModuleLayer.empty().defineModules(cf, mn -> loader);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Parent of configuration != configuration of parent Layer
|
||||
* Parent of configuration != configuration of parent layer
|
||||
*/
|
||||
@Test(expectedExceptions = { IllegalArgumentException.class })
|
||||
public void testIncorrectParent2() {
|
||||
|
||||
ModuleDescriptor descriptor1 = newBuilder("m1")
|
||||
.build();
|
||||
ModuleDescriptor descriptor1 = newBuilder("m1").build();
|
||||
|
||||
ModuleFinder finder = ModuleUtils.finderOf(descriptor1);
|
||||
|
||||
Configuration cf = resolve(finder, "m1");
|
||||
|
||||
ClassLoader loader = new ClassLoader() { };
|
||||
Layer.boot().defineModules(cf, mn -> loader);
|
||||
ModuleLayer.boot().defineModules(cf, mn -> loader);
|
||||
}
|
||||
|
||||
|
||||
@ -1161,35 +1155,35 @@ public class BasicLayerTest {
|
||||
@Test(expectedExceptions = { NullPointerException.class })
|
||||
public void testCreateWithNull1() {
|
||||
ClassLoader loader = new ClassLoader() { };
|
||||
Layer.empty().defineModules(null, mn -> loader);
|
||||
ModuleLayer.empty().defineModules(null, mn -> loader);
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = { NullPointerException.class })
|
||||
public void testCreateWithNull2() {
|
||||
Configuration cf = resolve(Layer.boot().configuration(), ModuleFinder.of());
|
||||
Layer.boot().defineModules(cf, null);
|
||||
Configuration cf = resolve(ModuleLayer.boot().configuration(), ModuleFinder.of());
|
||||
ModuleLayer.boot().defineModules(cf, null);
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = { NullPointerException.class })
|
||||
public void testCreateWithNull3() {
|
||||
ClassLoader scl = ClassLoader.getSystemClassLoader();
|
||||
Layer.empty().defineModulesWithOneLoader(null, scl);
|
||||
ModuleLayer.empty().defineModulesWithOneLoader(null, scl);
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = { NullPointerException.class })
|
||||
public void testCreateWithNull4() {
|
||||
ClassLoader scl = ClassLoader.getSystemClassLoader();
|
||||
Layer.empty().defineModulesWithManyLoaders(null, scl);
|
||||
ModuleLayer.empty().defineModulesWithManyLoaders(null, scl);
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = { NullPointerException.class })
|
||||
public void testFindModuleWithNull() {
|
||||
Layer.boot().findModule(null);
|
||||
ModuleLayer.boot().findModule(null);
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = { NullPointerException.class })
|
||||
public void testFindLoaderWithNull() {
|
||||
Layer.boot().findLoader(null);
|
||||
ModuleLayer.boot().findLoader(null);
|
||||
}
|
||||
|
||||
|
||||
@ -1198,7 +1192,7 @@ public class BasicLayerTest {
|
||||
@Test(expectedExceptions = { UnsupportedOperationException.class })
|
||||
public void testImmutableSet() {
|
||||
Module base = Object.class.getModule();
|
||||
Layer.boot().modules().add(base);
|
||||
ModuleLayer.boot().modules().add(base);
|
||||
}
|
||||
|
||||
|
@ -27,7 +27,7 @@
|
||||
* @modules jdk.compiler
|
||||
* @build LayerAndLoadersTest CompilerUtils ModuleUtils
|
||||
* @run testng LayerAndLoadersTest
|
||||
* @summary Tests for java.lang.reflect.Layer@createWithXXX methods
|
||||
* @summary Tests for java.lang.ModuleLayer@defineModulesWithXXX methods
|
||||
*/
|
||||
|
||||
import java.io.IOException;
|
||||
@ -36,10 +36,7 @@ import java.lang.module.Configuration;
|
||||
import java.lang.module.ModuleDescriptor;
|
||||
import java.lang.module.ModuleFinder;
|
||||
import java.lang.module.ModuleReference;
|
||||
import java.lang.reflect.Layer;
|
||||
import java.lang.reflect.LayerInstantiationException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Module;
|
||||
import java.net.URL;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
@ -74,7 +71,7 @@ public class LayerAndLoadersTest {
|
||||
|
||||
|
||||
/**
|
||||
* Basic test of Layer defineModulesWithOneLoader
|
||||
* Basic test of ModuleLayer.defineModulesWithOneLoader
|
||||
*
|
||||
* Test scenario:
|
||||
* m1 requires m2 and m3
|
||||
@ -85,7 +82,7 @@ public class LayerAndLoadersTest {
|
||||
|
||||
ClassLoader scl = ClassLoader.getSystemClassLoader();
|
||||
|
||||
Layer layer = Layer.boot().defineModulesWithOneLoader(cf, scl);
|
||||
ModuleLayer layer = ModuleLayer.boot().defineModulesWithOneLoader(cf, scl);
|
||||
|
||||
checkLayer(layer, "m1", "m2", "m3");
|
||||
|
||||
@ -103,7 +100,7 @@ public class LayerAndLoadersTest {
|
||||
|
||||
|
||||
/**
|
||||
* Basic test of Layer defineModulesWithManyLoaders
|
||||
* Basic test of ModuleLayer.defineModulesWithManyLoaders
|
||||
*
|
||||
* Test scenario:
|
||||
* m1 requires m2 and m3
|
||||
@ -114,7 +111,7 @@ public class LayerAndLoadersTest {
|
||||
|
||||
ClassLoader scl = ClassLoader.getSystemClassLoader();
|
||||
|
||||
Layer layer = Layer.boot().defineModulesWithManyLoaders(cf, scl);
|
||||
ModuleLayer layer = ModuleLayer.boot().defineModulesWithManyLoaders(cf, scl);
|
||||
|
||||
checkLayer(layer, "m1", "m2", "m3");
|
||||
|
||||
@ -135,8 +132,8 @@ public class LayerAndLoadersTest {
|
||||
|
||||
|
||||
/**
|
||||
* Basic test of Layer defineModulesWithOneLoader where one of the modules
|
||||
* is a service provider module.
|
||||
* Basic test of ModuleLayer.defineModulesWithOneLoader where one of the
|
||||
* modules is a service provider module.
|
||||
*
|
||||
* Test scenario:
|
||||
* m1 requires m2 and m3
|
||||
@ -149,7 +146,7 @@ public class LayerAndLoadersTest {
|
||||
|
||||
ClassLoader scl = ClassLoader.getSystemClassLoader();
|
||||
|
||||
Layer layer = Layer.boot().defineModulesWithOneLoader(cf, scl);
|
||||
ModuleLayer layer = ModuleLayer.boot().defineModulesWithOneLoader(cf, scl);
|
||||
|
||||
checkLayer(layer, "m1", "m2", "m3", "m4");
|
||||
|
||||
@ -176,7 +173,7 @@ public class LayerAndLoadersTest {
|
||||
|
||||
|
||||
/**
|
||||
* Basic test of Layer defineModulesWithManyLoaders where one of the
|
||||
* Basic test of ModuleLayer.defineModulesWithManyLoaders where one of the
|
||||
* modules is a service provider module.
|
||||
*
|
||||
* Test scenario:
|
||||
@ -190,7 +187,7 @@ public class LayerAndLoadersTest {
|
||||
|
||||
ClassLoader scl = ClassLoader.getSystemClassLoader();
|
||||
|
||||
Layer layer = Layer.boot().defineModulesWithManyLoaders(cf, scl);
|
||||
ModuleLayer layer = ModuleLayer.boot().defineModulesWithManyLoaders(cf, scl);
|
||||
|
||||
checkLayer(layer, "m1", "m2", "m3", "m4");
|
||||
|
||||
@ -239,19 +236,19 @@ public class LayerAndLoadersTest {
|
||||
String cn = this.getClass().getName();
|
||||
|
||||
// one loader
|
||||
Layer layer = Layer.boot().defineModulesWithOneLoader(cf, parent);
|
||||
ModuleLayer layer = ModuleLayer.boot().defineModulesWithOneLoader(cf, parent);
|
||||
testLoad(layer, cn);
|
||||
|
||||
// one loader with boot loader as parent
|
||||
layer = Layer.boot().defineModulesWithOneLoader(cf, null);
|
||||
layer = ModuleLayer.boot().defineModulesWithOneLoader(cf, null);
|
||||
testLoadFail(layer, cn);
|
||||
|
||||
// many loaders
|
||||
layer = Layer.boot().defineModulesWithManyLoaders(cf, parent);
|
||||
layer = ModuleLayer.boot().defineModulesWithManyLoaders(cf, parent);
|
||||
testLoad(layer, cn);
|
||||
|
||||
// many loader with boot loader as parent
|
||||
layer = Layer.boot().defineModulesWithManyLoaders(cf, null);
|
||||
layer = ModuleLayer.boot().defineModulesWithManyLoaders(cf, null);
|
||||
testLoadFail(layer, cn);
|
||||
|
||||
}
|
||||
@ -274,25 +271,25 @@ public class LayerAndLoadersTest {
|
||||
|
||||
ModuleFinder finder = ModuleUtils.finderOf(descriptor1, descriptor2);
|
||||
|
||||
Configuration cf = Layer.boot()
|
||||
Configuration cf = ModuleLayer.boot()
|
||||
.configuration()
|
||||
.resolve(finder, ModuleFinder.of(), Set.of("m1", "m2"));
|
||||
|
||||
// cannot define both module m1 and m2 to the same class loader
|
||||
try {
|
||||
Layer.boot().defineModulesWithOneLoader(cf, null);
|
||||
ModuleLayer.boot().defineModulesWithOneLoader(cf, null);
|
||||
assertTrue(false);
|
||||
} catch (LayerInstantiationException expected) { }
|
||||
|
||||
// should be okay to have one module per class loader
|
||||
Layer layer = Layer.boot().defineModulesWithManyLoaders(cf, null);
|
||||
ModuleLayer layer = ModuleLayer.boot().defineModulesWithManyLoaders(cf, null);
|
||||
checkLayer(layer, "m1", "m2");
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Test Layer defineModulesWithXXX with split delegation.
|
||||
* Test ModuleLayer.defineModulesWithXXX with split delegation.
|
||||
*
|
||||
* Test scenario:
|
||||
* layer1: m1 exports p, m2 exports p
|
||||
@ -308,11 +305,11 @@ public class LayerAndLoadersTest {
|
||||
|
||||
ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1, descriptor2);
|
||||
|
||||
Configuration cf1 = Layer.boot()
|
||||
Configuration cf1 = ModuleLayer.boot()
|
||||
.configuration()
|
||||
.resolve(finder1, ModuleFinder.of(), Set.of("m1", "m2"));
|
||||
|
||||
Layer layer1 = Layer.boot().defineModulesWithManyLoaders(cf1, null);
|
||||
ModuleLayer layer1 = ModuleLayer.boot().defineModulesWithManyLoaders(cf1, null);
|
||||
checkLayer(layer1, "m1", "m2");
|
||||
|
||||
ModuleDescriptor descriptor3
|
||||
@ -333,14 +330,14 @@ public class LayerAndLoadersTest {
|
||||
} catch (LayerInstantiationException expected) { }
|
||||
|
||||
// no split delegation when modules have their own class loader
|
||||
Layer layer2 = layer1.defineModulesWithManyLoaders(cf2, null);
|
||||
ModuleLayer layer2 = layer1.defineModulesWithManyLoaders(cf2, null);
|
||||
checkLayer(layer2, "m3", "m4");
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Test Layer defineModulesWithXXX when the modules that override same
|
||||
* Test ModuleLayer.defineModulesWithXXX when the modules that override same
|
||||
* named modules in the parent layer.
|
||||
*
|
||||
* Test scenario:
|
||||
@ -351,14 +348,14 @@ public class LayerAndLoadersTest {
|
||||
|
||||
Configuration cf1 = resolve("m1");
|
||||
|
||||
Layer layer1 = Layer.boot().defineModulesWithOneLoader(cf1, null);
|
||||
ModuleLayer layer1 = ModuleLayer.boot().defineModulesWithOneLoader(cf1, null);
|
||||
checkLayer(layer1, "m1", "m2", "m3");
|
||||
|
||||
ModuleFinder finder = ModuleFinder.of(MODS_DIR);
|
||||
Configuration cf2 = cf1.resolve(finder, ModuleFinder.of(),
|
||||
Set.of("m1"));
|
||||
|
||||
Layer layer2 = layer1.defineModulesWithOneLoader(cf2, null);
|
||||
ModuleLayer layer2 = layer1.defineModulesWithOneLoader(cf2, null);
|
||||
checkLayer(layer2, "m1", "m2", "m3");
|
||||
invoke(layer1, "m1", "p.Main");
|
||||
|
||||
@ -400,14 +397,14 @@ public class LayerAndLoadersTest {
|
||||
|
||||
Configuration cf1 = resolve("m1");
|
||||
|
||||
Layer layer1 = Layer.boot().defineModulesWithManyLoaders(cf1, null);
|
||||
ModuleLayer layer1 = ModuleLayer.boot().defineModulesWithManyLoaders(cf1, null);
|
||||
checkLayer(layer1, "m1", "m2", "m3");
|
||||
|
||||
ModuleFinder finder = ModuleFinder.of(MODS_DIR);
|
||||
Configuration cf2 = cf1.resolve(finder, ModuleFinder.of(),
|
||||
Set.of("m1"));
|
||||
|
||||
Layer layer2 = layer1.defineModulesWithManyLoaders(cf2, null);
|
||||
ModuleLayer layer2 = layer1.defineModulesWithManyLoaders(cf2, null);
|
||||
checkLayer(layer2, "m1", "m2", "m3");
|
||||
invoke(layer1, "m1", "p.Main");
|
||||
|
||||
@ -484,7 +481,7 @@ public class LayerAndLoadersTest {
|
||||
|
||||
|
||||
/**
|
||||
* Test Layer defineModulesWithXXX when the modules that override same
|
||||
* Test ModuleLayer.defineModulesWithXXX when the modules that override same
|
||||
* named modules in the parent layer.
|
||||
*
|
||||
* layer1: m1, m2, m3 => same loader
|
||||
@ -494,7 +491,7 @@ public class LayerAndLoadersTest {
|
||||
|
||||
Configuration cf1 = resolve("m1");
|
||||
|
||||
Layer layer1 = Layer.boot().defineModulesWithOneLoader(cf1, null);
|
||||
ModuleLayer layer1 = ModuleLayer.boot().defineModulesWithOneLoader(cf1, null);
|
||||
checkLayer(layer1, "m1", "m2", "m3");
|
||||
|
||||
ModuleFinder finder = finderFor("m1", "m3");
|
||||
@ -502,7 +499,7 @@ public class LayerAndLoadersTest {
|
||||
Configuration cf2 = cf1.resolve(finder, ModuleFinder.of(),
|
||||
Set.of("m1"));
|
||||
|
||||
Layer layer2 = layer1.defineModulesWithOneLoader(cf2, null);
|
||||
ModuleLayer layer2 = layer1.defineModulesWithOneLoader(cf2, null);
|
||||
checkLayer(layer2, "m1", "m3");
|
||||
invoke(layer1, "m1", "p.Main");
|
||||
|
||||
@ -531,7 +528,7 @@ public class LayerAndLoadersTest {
|
||||
|
||||
Configuration cf1 = resolve("m1");
|
||||
|
||||
Layer layer1 = Layer.boot().defineModulesWithManyLoaders(cf1, null);
|
||||
ModuleLayer layer1 = ModuleLayer.boot().defineModulesWithManyLoaders(cf1, null);
|
||||
checkLayer(layer1, "m1", "m2", "m3");
|
||||
|
||||
ModuleFinder finder = finderFor("m1", "m3");
|
||||
@ -539,7 +536,7 @@ public class LayerAndLoadersTest {
|
||||
Configuration cf2 = cf1.resolve(finder, ModuleFinder.of(),
|
||||
Set.of("m1"));
|
||||
|
||||
Layer layer2 = layer1.defineModulesWithManyLoaders(cf2, null);
|
||||
ModuleLayer layer2 = layer1.defineModulesWithManyLoaders(cf2, null);
|
||||
checkLayer(layer2, "m1", "m3");
|
||||
invoke(layer1, "m1", "p.Main");
|
||||
|
||||
@ -579,7 +576,7 @@ public class LayerAndLoadersTest {
|
||||
public void testResourcesOneLoader() throws Exception {
|
||||
Configuration cf = resolve("m1");
|
||||
ClassLoader scl = ClassLoader.getSystemClassLoader();
|
||||
Layer layer = Layer.boot().defineModulesWithOneLoader(cf, scl);
|
||||
ModuleLayer layer = ModuleLayer.boot().defineModulesWithOneLoader(cf, scl);
|
||||
ClassLoader loader = layer.findLoader("m1");
|
||||
testResourceLoading(loader, "p/Main.class");
|
||||
}
|
||||
@ -591,7 +588,7 @@ public class LayerAndLoadersTest {
|
||||
public void testResourcesManyLoaders() throws Exception {
|
||||
Configuration cf = resolve("m1");
|
||||
ClassLoader scl = ClassLoader.getSystemClassLoader();
|
||||
Layer layer = Layer.boot().defineModulesWithManyLoaders(cf, scl);
|
||||
ModuleLayer layer = ModuleLayer.boot().defineModulesWithManyLoaders(cf, scl);
|
||||
ClassLoader loader = layer.findLoader("m1");
|
||||
testResourceLoading(loader, "p/Main.class");
|
||||
}
|
||||
@ -623,7 +620,7 @@ public class LayerAndLoadersTest {
|
||||
*/
|
||||
private static Configuration resolve(String... roots) {
|
||||
ModuleFinder finder = ModuleFinder.of(MODS_DIR);
|
||||
return Layer.boot()
|
||||
return ModuleLayer.boot()
|
||||
.configuration()
|
||||
.resolve(finder, ModuleFinder.of(), Set.of(roots));
|
||||
}
|
||||
@ -634,7 +631,7 @@ public class LayerAndLoadersTest {
|
||||
*/
|
||||
private static Configuration resolveAndBind(String... roots) {
|
||||
ModuleFinder finder = ModuleFinder.of(MODS_DIR);
|
||||
return Layer.boot()
|
||||
return ModuleLayer.boot()
|
||||
.configuration()
|
||||
.resolveAndBind(finder, ModuleFinder.of(), Set.of(roots));
|
||||
}
|
||||
@ -644,7 +641,7 @@ public class LayerAndLoadersTest {
|
||||
* Invokes the static void main(String[]) method on the given class
|
||||
* in the given module.
|
||||
*/
|
||||
private static void invoke(Layer layer, String mn, String mc) throws Exception {
|
||||
private static void invoke(ModuleLayer layer, String mn, String mc) throws Exception {
|
||||
ClassLoader loader = layer.findLoader(mn);
|
||||
Class<?> c = loader.loadClass(mc);
|
||||
Method mainMethod = c.getMethod("main", String[].class);
|
||||
@ -656,7 +653,7 @@ public class LayerAndLoadersTest {
|
||||
* Checks that the given layer contains exactly the expected modules
|
||||
* (by name).
|
||||
*/
|
||||
private void checkLayer(Layer layer, String ... expected) {
|
||||
private void checkLayer(ModuleLayer layer, String ... expected) {
|
||||
Set<String> names = layer.modules().stream()
|
||||
.map(Module::getName)
|
||||
.collect(Collectors.toSet());
|
||||
@ -671,7 +668,7 @@ public class LayerAndLoadersTest {
|
||||
* Test that a class can be loaded via the class loader of all modules
|
||||
* in the given layer.
|
||||
*/
|
||||
static void testLoad(Layer layer, String cn) throws Exception {
|
||||
static void testLoad(ModuleLayer layer, String cn) throws Exception {
|
||||
for (Module m : layer.modules()) {
|
||||
ClassLoader l = m.getClassLoader();
|
||||
l.loadClass(cn);
|
||||
@ -683,7 +680,7 @@ public class LayerAndLoadersTest {
|
||||
* Test that a class cannot be loaded via any of the class loaders of
|
||||
* the modules in the given layer.
|
||||
*/
|
||||
static void testLoadFail(Layer layer, String cn) throws Exception {
|
||||
static void testLoadFail(ModuleLayer layer, String cn) throws Exception {
|
||||
for (Module m : layer.modules()) {
|
||||
ClassLoader l = m.getClassLoader();
|
||||
try {
|
@ -26,14 +26,12 @@
|
||||
* @library /lib/testlibrary
|
||||
* @build LayerControllerTest ModuleUtils
|
||||
* @run testng LayerControllerTest
|
||||
* @summary Basic tests for java.lang.reflect.Layer.Controller
|
||||
* @summary Basic tests for java.lang.ModuleLayer.Controller
|
||||
*/
|
||||
|
||||
import java.lang.module.Configuration;
|
||||
import java.lang.module.ModuleDescriptor;
|
||||
import java.lang.module.ModuleFinder;
|
||||
import java.lang.reflect.Layer;
|
||||
import java.lang.reflect.Module;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
@ -48,7 +46,7 @@ public class LayerControllerTest {
|
||||
* Module m1 contains p1, reads java.base, does not export/open any package
|
||||
* Module m2 contains p2, reads java.base, does not export/open any package
|
||||
*/
|
||||
private Layer.Controller createTestLayer() {
|
||||
private ModuleLayer.Controller createTestLayer() {
|
||||
ModuleDescriptor descriptor1
|
||||
= ModuleDescriptor.newModule("m1")
|
||||
.packages(Set.of("p1"))
|
||||
@ -62,17 +60,17 @@ public class LayerControllerTest {
|
||||
.build();
|
||||
|
||||
ModuleFinder finder = ModuleUtils.finderOf(descriptor1, descriptor2);
|
||||
Layer bootLayer = Layer.boot();
|
||||
ModuleLayer bootLayer = ModuleLayer.boot();
|
||||
|
||||
Configuration cf = bootLayer.configuration()
|
||||
.resolve(finder, ModuleFinder.of(), Set.of("m1", "m2"));
|
||||
|
||||
ClassLoader scl = ClassLoader.getSystemClassLoader();
|
||||
|
||||
Layer.Controller controller
|
||||
= Layer.defineModulesWithOneLoader(cf, List.of(bootLayer), scl);
|
||||
ModuleLayer.Controller controller
|
||||
= ModuleLayer.defineModulesWithOneLoader(cf, List.of(bootLayer), scl);
|
||||
|
||||
Layer layer = controller.layer();
|
||||
ModuleLayer layer = controller.layer();
|
||||
|
||||
assertTrue(layer.modules().size() == 2);
|
||||
assertTrue(layer.findModule("m1").isPresent());
|
||||
@ -82,12 +80,12 @@ public class LayerControllerTest {
|
||||
}
|
||||
|
||||
/**
|
||||
* Basic test of Layer.Controller to update modules m1 and m2 to read and
|
||||
* Basic test of Controller to update modules m1 and m2 to read and
|
||||
* open packages to each other.
|
||||
*/
|
||||
public void testBasic() {
|
||||
Layer.Controller controller = createTestLayer();
|
||||
Layer layer = controller.layer();
|
||||
ModuleLayer.Controller controller = createTestLayer();
|
||||
ModuleLayer layer = controller.layer();
|
||||
Module m1 = layer.findModule("m1").orElseThrow(RuntimeException::new);
|
||||
Module m2 = layer.findModule("m2").orElseThrow(RuntimeException::new);
|
||||
|
||||
@ -132,8 +130,8 @@ public class LayerControllerTest {
|
||||
* Test invalid argument handling
|
||||
*/
|
||||
public void testBadArguments() {
|
||||
Layer.Controller controller = createTestLayer();
|
||||
Layer layer = controller.layer();
|
||||
ModuleLayer.Controller controller = createTestLayer();
|
||||
ModuleLayer layer = controller.layer();
|
||||
Module m1 = layer.findModule("m1").orElseThrow(RuntimeException::new);
|
||||
Module m2 = layer.findModule("m2").orElseThrow(RuntimeException::new);
|
||||
Module base = Object.class.getModule();
|
||||
@ -161,8 +159,8 @@ public class LayerControllerTest {
|
||||
* Test null handling
|
||||
*/
|
||||
public void testNulls() {
|
||||
Layer.Controller controller = createTestLayer();
|
||||
Layer layer = controller.layer();
|
||||
ModuleLayer.Controller controller = createTestLayer();
|
||||
ModuleLayer layer = controller.layer();
|
||||
Module m1 = layer.findModule("m1").orElseThrow(RuntimeException::new);
|
||||
Module m2 = layer.findModule("m2").orElseThrow(RuntimeException::new);
|
||||
assertTrue(m1 != null);
|
@ -22,7 +22,7 @@
|
||||
*/
|
||||
|
||||
/**
|
||||
* Supporting class for tests of java.lang.reflect.Layer.
|
||||
* Supporting class for tests of java.lang.ModuleLayer.
|
||||
*/
|
||||
|
||||
package layertest;
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user