On Thu, 19 Mar 2026 14:23:21 GMT, Jaikiran Pai <[email protected]> wrote:

>> Consider these classes:
>> 
>> package p;
>> public class Lib {
>>     void main(String... args) {
>>         System.err.println("Lib!");
>>     }
>> }
>> 
>> and:
>> 
>> import p.Lib;
>> public class Main extends Lib {
>>     public void main() {
>>         System.err.println("Main!");
>>     }
>> }
>> 
>> 
>> Note the classes are in different packages. Running this on JDK 26 yields:
>> 
>> $ jdk-26/bin/java Main.java
>> Lib!
>> 
>> 
>> that is not correct - the method `Lib.main(String[])` is package private, 
>> and is not inherited to `Main`, i.e. not a member of `Main`, and hence the 
>> launcher should not use it. The launcher should only inspect methods that 
>> are members (direct or inherited) of `Main`.
>> 
>> This PR fixes that by only using package-private methods in they are 
>> declared in the same class as is the main class. Testing is enhanced to 
>> cover all related cases I/we were able to find.
>> 
>> Also please review the corresponding CSR:
>> https://bugs.openjdk.org/browse/JDK-8378555
>
> src/java.base/share/classes/jdk/internal/misc/MethodFinder.java line 107:
> 
>> 105:                (Modifier.isPublic(mainMethodCandidate.getModifiers()) ||
>> 106:                 
>> Modifier.isProtected(mainMethodCandidate.getModifiers()) ||
>> 107:                 initialClass.getPackage() == 
>> mainMethodCandidate.getDeclaringClass().getPackage());
> 
> Hello Jan, `Class.getPackage()` doesn't specify that it will return the same 
> `Package` instance for multiple calls of that method on the same `Class` 
> instance. Briefly looking at the implementation, it appears that only 
> `BootClassLoader` might return the same `Package` instance for multiple calls.
> 
> I was going to suggest that maybe we should use `Package.equals()`, but I 
> can't find an implementation of that method in `Package`, so it would again 
> end up being a identity check.
> 
> The other option would be checking the package name `equals()`ity but I think 
> that would also additionally need a ClassLoader equality check for 
> `initialClass.getClassLoader()` and 
> `mainMethodCandidate.getDeclaringClass().getClassLoader()`

Right, it should use Class.getClassLoader + Class::getPackageName to check if 
the two classes are in the same runtime package.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/30221#discussion_r2962299513

Reply via email to