Skip to content

Commit 684be06

Browse files
committed
[JPMS] Letting spec module open target packages towards impl module instead of propagating lookup object
1 parent 4669172 commit 684be06

File tree

4 files changed

+41
-39
lines changed

4 files changed

+41
-39
lines changed

java9/spec-modularity-patterns/acme-fieldreader-impl/src/main/java/acme/fieldreader/impl/AcmeBootstrapDelegate.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
public class AcmeBootstrapDelegate implements BootstrapDelegate {
77

88
@Override
9-
public FieldValueReader getFieldValueReader(LookupProvider lookupProvider) {
10-
return new FieldValueReaderImpl( lookupProvider );
9+
public FieldValueReader getFieldValueReader(PackageOpener opener) {
10+
return new FieldValueReaderImpl( opener );
1111
}
1212
}

java9/spec-modularity-patterns/acme-fieldreader-impl/src/main/java/acme/fieldreader/impl/FieldValueReaderImpl.java

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,46 @@
11
package acme.fieldreader.impl;
22

3+
import java.lang.invoke.MethodHandles;
4+
import java.lang.invoke.MethodHandles.Lookup;
5+
36
import fieldreader.spec.FieldValueReader;
4-
import fieldreader.spec.bootstrap.BootstrapDelegate.LookupProvider;
7+
import fieldreader.spec.bootstrap.BootstrapDelegate.PackageOpener;
58

69
public class FieldValueReaderImpl implements FieldValueReader {
710

8-
private LookupProvider lookupProvider;
11+
private final ClassValue<Lookup> lookups;
12+
13+
public FieldValueReaderImpl(PackageOpener moduleOpener) {
14+
this.lookups = new ClassValue<Lookup>() {
15+
16+
@Override
17+
protected Lookup computeValue(Class<?> type) {
18+
if ( !getClass().getModule().canRead( type.getModule() ) ) {
19+
getClass().getModule().addReads( type.getModule() );
20+
}
21+
22+
moduleOpener.openPackageIfNeeded(
23+
type.getModule(), type.getPackageName(), FieldValueReaderImpl.class.getModule()
24+
);
925

10-
public FieldValueReaderImpl(LookupProvider lookupProvider) {
11-
this.lookupProvider = lookupProvider;
26+
try {
27+
return MethodHandles.privateLookupIn( type, MethodHandles.lookup() );
28+
}
29+
catch (IllegalAccessException e) {
30+
throw new RuntimeException( e );
31+
}
32+
}
33+
};
1234
}
1335

1436
@Override
1537
public Object getFieldValue(Object o, String fieldName) {
1638
try {
17-
return lookupProvider.getPrivateLookup( o )
39+
return lookups.get( o.getClass() )
1840
.unreflectVarHandle( o.getClass().getDeclaredField( fieldName ) )
1941
.get( o );
2042
}
21-
catch (Throwable e) {
43+
catch (Exception e) {
2244
throw new RuntimeException( e );
2345
}
2446
}
Lines changed: 8 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,29 @@
11
package fieldreader.spec;
22

3-
import java.lang.invoke.MethodHandles;
4-
import java.lang.invoke.MethodHandles.Lookup;
53
import java.util.ServiceLoader;
64

75
import fieldreader.spec.bootstrap.BootstrapDelegate;
8-
import fieldreader.spec.bootstrap.BootstrapDelegate.LookupProvider;
6+
import fieldreader.spec.bootstrap.BootstrapDelegate.PackageOpener;
97

108
public class FieldReaderApi {
119

12-
private static final LookupProvider LOOKUP_PROVIDER = new LookupProviderImpl();
10+
private static final PackageOpener PACKAGE_OPENER = new PackageOpenerImpl();
1311

1412
public static FieldValueReader getFieldValueReader() {
1513
ServiceLoader<BootstrapDelegate> loader = ServiceLoader.load( BootstrapDelegate.class );
1614

1715
return loader.findFirst()
1816
.orElseThrow( () -> new IllegalStateException( "No provider of " + BootstrapDelegate.class.getName() + " available" ) )
19-
.getFieldValueReader( LOOKUP_PROVIDER );
17+
.getFieldValueReader( PACKAGE_OPENER );
2018
}
2119

22-
private static class LookupProviderImpl implements BootstrapDelegate.LookupProvider {
23-
24-
private final ClassValue<Lookup> classValue;
25-
26-
private LookupProviderImpl() {
27-
classValue = new ClassValue<Lookup>() {
28-
29-
@Override
30-
protected Lookup computeValue(Class<?> type) {
31-
FieldValueReader.class.getModule().addReads( type.getModule() );
32-
try {
33-
return MethodHandles.privateLookupIn( type, MethodHandles.lookup() );
34-
}
35-
catch (IllegalAccessException e) {
36-
throw new RuntimeException( e );
37-
}
38-
}
39-
};
40-
}
20+
private static class PackageOpenerImpl implements BootstrapDelegate.PackageOpener {
4121

4222
@Override
43-
public Lookup getPrivateLookup(Object o) {
44-
return classValue.get( o.getClass() );
23+
public void openPackageIfNeeded(Module targetModule, String targetPackage, Module specImplModule) {
24+
if ( !targetModule.isOpen( targetPackage, specImplModule ) ) {
25+
targetModule.addOpens( targetPackage, specImplModule );
26+
}
4527
}
4628
}
4729
}
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
package fieldreader.spec.bootstrap;
22

3-
import java.lang.invoke.MethodHandles.Lookup;
4-
53
import fieldreader.spec.FieldValueReader;
64

75
public interface BootstrapDelegate {
86

9-
FieldValueReader getFieldValueReader(LookupProvider lookupProvider);
7+
FieldValueReader getFieldValueReader(PackageOpener opener);
108

11-
public interface LookupProvider {
12-
Lookup getPrivateLookup(Object o);
9+
public interface PackageOpener {
10+
void openPackageIfNeeded(Module targetModule, String targetPackage, Module specImplModule);
1311
}
1412
}

0 commit comments

Comments
 (0)