@@ -46,13 +46,13 @@ public class JdkApiExtractor {
46
46
// exclude both final and non-final variants of these
47
47
private static final Set <AccessibleMethod > EXCLUDES = Set .of (
48
48
new AccessibleMethod ("toString" , "()Ljava/lang/String;" , true , false , false ),
49
+ new AccessibleMethod ("toString" , "()Ljava/lang/String;" , true , true , false ),
49
50
new AccessibleMethod ("hashCode" , "()I" , true , false , false ),
51
+ new AccessibleMethod ("hashCode" , "()I" , true , true , false ),
50
52
new AccessibleMethod ("equals" , "(Ljava/lang/Object;)Z" , true , false , false ),
51
- new AccessibleMethod ("close" , "()V" , true , false , false ),
52
- new AccessibleMethod ("toString" , "()Ljava/lang/String;" , true , true , false ),
53
- new AccessibleMethod ("hashCode" , "()I" , true , false , true ),
54
53
new AccessibleMethod ("equals" , "(Ljava/lang/Object;)Z" , true , true , false ),
55
- new AccessibleMethod ("close" , "()V" , true , false , true )
54
+ new AccessibleMethod ("close" , "()V" , true , false , false ),
55
+ new AccessibleMethod ("close" , "()V" , true , true , false )
56
56
);
57
57
58
58
private static String DEPRECATIONS_ONLY = "--deprecations-only" ;
@@ -66,7 +66,7 @@ public static void main(String[] args) throws IOException {
66
66
67
67
final Map <String , String > moduleNameByClass = new HashMap <>();
68
68
final Map <ModuleClass , Set <AccessibleMethod >> accessibleImplementationsByClass = new TreeMap <>(ModuleClass .COMPARATOR );
69
- final Map <ModuleClass , Set <AccessibleMethod >> accessibleForOverridesByClass = new TreeMap <>(ModuleClass .COMPARATOR );
69
+ final Map <ModuleClass , Set <AccessibleMethod >> inheritableAccessByClass = new TreeMap <>(ModuleClass .COMPARATOR );
70
70
final Map <ModuleClass , Set <AccessibleMethod >> deprecationsByClass = new TreeMap <>(ModuleClass .COMPARATOR );
71
71
72
72
final Map <String , Set <String >> exportsByModule = Utils .findModuleExports ();
@@ -84,7 +84,7 @@ public static void main(String[] args) throws IOException {
84
84
moduleNameByClass ,
85
85
exportsByModule ,
86
86
accessibleImplementationsByClass ,
87
- accessibleForOverridesByClass ,
87
+ inheritableAccessByClass ,
88
88
deprecationsByClass
89
89
);
90
90
Predicate <String > modulePredicate = Utils .DEFAULT_MODULE_PREDICATE .or (
@@ -206,11 +206,11 @@ static class AccessibleClassVisitor extends ClassVisitor {
206
206
private final Map <String , String > moduleNameByClass ;
207
207
private final Map <String , Set <String >> exportsByModule ;
208
208
private final Map <ModuleClass , Set <AccessibleMethod >> accessibleImplementationsByClass ;
209
- private final Map <ModuleClass , Set <AccessibleMethod >> accessibleForOverridesByClass ;
209
+ private final Map <ModuleClass , Set <AccessibleMethod >> inheritableAccessByClass ;
210
210
private final Map <ModuleClass , Set <AccessibleMethod >> deprecationsByClass ;
211
211
212
212
private Set <AccessibleMethod > accessibleImplementations ;
213
- private Set <AccessibleMethod > accessibleForOverrides ;
213
+ private Set <AccessibleMethod > inheritableAccess ;
214
214
private Set <AccessibleMethod > deprecations ;
215
215
216
216
private ModuleClass moduleClass ;
@@ -223,14 +223,14 @@ static class AccessibleClassVisitor extends ClassVisitor {
223
223
Map <String , String > moduleNameByClass ,
224
224
Map <String , Set <String >> exportsByModule ,
225
225
Map <ModuleClass , Set <AccessibleMethod >> accessibleImplementationsByClass ,
226
- Map <ModuleClass , Set <AccessibleMethod >> accessibleForOverridesByClass ,
226
+ Map <ModuleClass , Set <AccessibleMethod >> inheritableAccessByClass ,
227
227
Map <ModuleClass , Set <AccessibleMethod >> deprecationsByClass
228
228
) {
229
229
super (ASM9 );
230
230
this .moduleNameByClass = moduleNameByClass ;
231
231
this .exportsByModule = exportsByModule ;
232
232
this .accessibleImplementationsByClass = accessibleImplementationsByClass ;
233
- this .accessibleForOverridesByClass = accessibleForOverridesByClass ;
233
+ this .inheritableAccessByClass = inheritableAccessByClass ;
234
234
this .deprecationsByClass = deprecationsByClass ;
235
235
}
236
236
@@ -240,21 +240,21 @@ private static Set<AccessibleMethod> newSortedSet() {
240
240
241
241
@ Override
242
242
public void visit (int version , int access , String name , String signature , String superName , String [] interfaces ) {
243
- final Set <AccessibleMethod > currentAccessibleForOverrides = newSortedSet ();
243
+ final Set <AccessibleMethod > currentInheritedAccess = newSortedSet ();
244
244
if (superName != null ) {
245
245
var superModuleClass = getModuleClass (superName );
246
246
if (accessibleImplementationsByClass .containsKey (superModuleClass ) == false ) {
247
247
visitSuperClass (superName );
248
248
}
249
- currentAccessibleForOverrides .addAll (accessibleForOverridesByClass .getOrDefault (superModuleClass , emptySet ()));
249
+ currentInheritedAccess .addAll (inheritableAccessByClass .getOrDefault (superModuleClass , emptySet ()));
250
250
}
251
251
if (interfaces != null && interfaces .length > 0 ) {
252
252
for (var interfaceName : interfaces ) {
253
253
var interfaceModuleClass = getModuleClass (interfaceName );
254
254
if (accessibleImplementationsByClass .containsKey (interfaceModuleClass ) == false ) {
255
255
visitInterface (interfaceName );
256
256
}
257
- currentAccessibleForOverrides .addAll (accessibleForOverridesByClass .getOrDefault (interfaceModuleClass , emptySet ()));
257
+ currentInheritedAccess .addAll (inheritableAccessByClass .getOrDefault (interfaceModuleClass , emptySet ()));
258
258
}
259
259
}
260
260
// only initialize local state AFTER visiting all dependencies above!
@@ -264,7 +264,7 @@ public void visit(int version, int access, String name, String signature, String
264
264
this .isPublicClass = (access & ACC_PUBLIC ) != 0 ;
265
265
this .isFinalClass = (access & ACC_FINAL ) != 0 ;
266
266
this .isDeprecatedClass = (access & ACC_DEPRECATED ) != 0 ;
267
- this .accessibleForOverrides = currentAccessibleForOverrides ;
267
+ this .inheritableAccess = currentInheritedAccess ;
268
268
this .accessibleImplementations = newSortedSet ();
269
269
this .deprecations = newSortedSet ();
270
270
}
@@ -289,7 +289,7 @@ private Set<String> getModuleExports(String module) {
289
289
public void visitEnd () {
290
290
super .visitEnd ();
291
291
if (accessibleImplementationsByClass .put (moduleClass , unmodifiableSet (accessibleImplementations )) != null
292
- || accessibleForOverridesByClass .put (moduleClass , unmodifiableSet (accessibleForOverrides )) != null
292
+ || inheritableAccessByClass .put (moduleClass , unmodifiableSet (inheritableAccess )) != null
293
293
|| deprecationsByClass .put (moduleClass , unmodifiableSet (deprecations )) != null ) {
294
294
throw new IllegalStateException ("Class " + moduleClass .clazz + " was already visited!" );
295
295
}
@@ -337,18 +337,21 @@ public final MethodVisitor visitMethod(int access, String name, String descripto
337
337
338
338
var method = new AccessibleMethod (name , descriptor , isPublic , isFinal , isStatic );
339
339
if (isPublicClass && isExported && EXCLUDES .contains (method ) == false ) {
340
- // class is public and exported, for final classes skip non-public methods
340
+ // class is public and exported, to be accessible outside the JDK the method must be either:
341
+ // - public or
342
+ // - protected if not a final class
341
343
if (isPublic || isFinalClass == false ) {
342
344
accessibleImplementations .add (method );
343
- // if not static, the method is accessible for overrides
344
- if (isStatic == false ) {
345
- accessibleForOverrides .add (method );
345
+ // if public and not static, the method can be accessible on non-public and non-exported subclasses,
346
+ // but skip constructors
347
+ if (isPublic && isStatic == false && name .equals ("<init>" ) == false ) {
348
+ inheritableAccess .add (method );
346
349
}
347
350
if (isDeprecatedClass || isDeprecated ) {
348
351
deprecations .add (method );
349
352
}
350
353
}
351
- } else if (accessibleForOverrides .contains (method )) {
354
+ } else if (inheritableAccess .contains (method )) {
352
355
accessibleImplementations .add (method );
353
356
if (isDeprecatedClass || isDeprecated ) {
354
357
deprecations .add (method );
0 commit comments