-
Notifications
You must be signed in to change notification settings - Fork 332
Expand file tree
/
Copy pathJDK9ModuleAccess.java
More file actions
63 lines (54 loc) · 2.14 KB
/
JDK9ModuleAccess.java
File metadata and controls
63 lines (54 loc) · 2.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package datadog.trace.util;
import static java.util.Collections.emptyMap;
import static java.util.Collections.emptySet;
import java.lang.instrument.Instrumentation;
import java.lang.reflect.AnnotatedElement;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/** Use standard API to work with JPMS modules on Java9+. */
@SuppressWarnings("Since15")
public final class JDK9ModuleAccess {
/** Retrieves a class-loader's unnamed module. */
public static AnnotatedElement getUnnamedModule(ClassLoader cl) {
return cl.getUnnamedModule();
}
/** Returns {@code true} if the first module can read the second module. */
public static boolean canRead(AnnotatedElement module, AnnotatedElement anotherModule) {
return ((java.lang.Module) module).canRead((java.lang.Module) anotherModule);
}
/** Adds extra module reads to the given module. */
@SuppressWarnings({"rawtypes", "unchecked"})
public static void addModuleReads(
Instrumentation inst, AnnotatedElement module, Set<AnnotatedElement> extraReads) {
inst.redefineModule(
(java.lang.Module) module,
(Set) extraReads,
emptyMap(),
emptyMap(),
emptySet(),
emptyMap());
}
/** Exports specific packages of a named module to a classloader's unnamed module. */
@SuppressWarnings({"rawtypes", "unchecked"})
public static void exportModuleToUnnamedModule(
Instrumentation inst,
String moduleName,
String[] packageNames,
ClassLoader targetClassLoader) {
java.util.Optional<java.lang.Module> optModule =
java.lang.ModuleLayer.boot().findModule(moduleName);
if (!optModule.isPresent()) {
return;
}
java.lang.Module module = optModule.get();
java.lang.Module unnamedModule = targetClassLoader.getUnnamedModule();
Set<java.lang.Module> target = Collections.singleton(unnamedModule);
Map<String, Set<java.lang.Module>> extraExports = new HashMap<>();
for (String packageName : packageNames) {
extraExports.put(packageName, target);
}
inst.redefineModule(module, emptySet(), extraExports, emptyMap(), emptySet(), emptyMap());
}
}