diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/launcher/SourceLauncher.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/launcher/SourceLauncher.java index 4d679403ee7..af7d79d4195 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/launcher/SourceLauncher.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/launcher/SourceLauncher.java @@ -226,6 +226,8 @@ public final class SourceLauncher { Object instance = null; + // Similar to sun.launcher.LauncherHelper#checkAndLoadMain, including + // checks performed in LauncherHelper#validateMainMethod if (!isStatic) { if (Modifier.isAbstract(mainClass.getModifiers())) { throw new Fault(Errors.CantInstantiate(mainClassName)); @@ -238,6 +240,10 @@ public final class SourceLauncher { throw new Fault(Errors.CantFindConstructor(mainClassName)); } + if (Modifier.isPrivate(constructor.getModifiers())) { + throw new Fault(Errors.CantUsePrivateConstructor(mainClassName)); + } + try { constructor.setAccessible(true); instance = constructor.newInstance(); diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher.properties index 122e5dca80d..36d50afad0f 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher.properties +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher.properties @@ -124,6 +124,12 @@ launcher.err.cant.access.main.method=\ launcher.err.cant.find.constructor=\ can''t find no argument constructor in class: {0} +# 0: string +launcher.err.cant.use.private.constructor=\ + no non-private zero argument constructor found in class {0}\n\ + remove private from existing constructor or define as:\n\ +\ public {0}() + # 0: string launcher.err.cant.access.constructor=\ can''t access no argument constructor in class: {0} diff --git a/test/langtools/tools/javac/launcher/SourceLauncherTest.java b/test/langtools/tools/javac/launcher/SourceLauncherTest.java index 6b147d32d00..37d50674855 100644 --- a/test/langtools/tools/javac/launcher/SourceLauncherTest.java +++ b/test/langtools/tools/javac/launcher/SourceLauncherTest.java @@ -798,6 +798,22 @@ public class SourceLauncherTest extends TestRunner { } } + @Test + public void testPrivateConstructor(Path base) throws IOException { + tb.writeJavaFiles(base, + """ + class PrivateConstructor { + private PrivateConstructor() {} + void main() {} + } + """); + testError(base.resolve("PrivateConstructor.java"), "", + """ + error: no non-private zero argument constructor found in class PrivateConstructor + remove private from existing constructor or define as: + public PrivateConstructor()"""); + } + @Test public void testAbstractClassInstanceMain(Path base) throws IOException { tb.writeJavaFiles(base, @@ -904,14 +920,6 @@ public class SourceLauncherTest extends TestRunner { } } - void checkContains(String name, String found, String expect) { - expect = expect.replace("\n", tb.lineSeparator); - out.println(name + ": " + found); - if (!found.contains(expect)) { - error("Expected output not found: " + expect); - } - } - void checkEqual(String name, List found, List expect) { out.println(name + ": " + found); tb.checkEqual(expect, found); @@ -939,7 +947,6 @@ public class SourceLauncherTest extends TestRunner { } void checkFault(String name, Throwable found, String expect) { - expect = expect.replace("\n", tb.lineSeparator); out.println(name + ": " + found); if (found == null) { error("No exception thrown; expected Fault"); @@ -947,8 +954,14 @@ public class SourceLauncherTest extends TestRunner { if (!(found instanceof Fault)) { error("Unexpected exception; expected Fault"); } - if (!(found.getMessage().equals(expect))) { - error("Unexpected detail message; expected: " + expect); + String actual = found.getMessage(); + List actualLines = actual.lines().toList(); + List expectLines = expect.lines().toList(); + if (!(actualLines.equals(expectLines))) { + error("Unexpected detail message; expected: \n" + + expect.indent(2) + + "\nactual:\n" + + actual.indent(2)); } } }