diff --git a/src/jdk.jshell/share/classes/jdk/jshell/tool/resources/TOOLING.jsh b/src/jdk.jshell/share/classes/jdk/jshell/tool/resources/TOOLING.jsh index b97b6341cfa02..16436514383f2 100644 --- a/src/jdk.jshell/share/classes/jdk/jshell/tool/resources/TOOLING.jsh +++ b/src/jdk.jshell/share/classes/jdk/jshell/tool/resources/TOOLING.jsh @@ -8,9 +8,9 @@ void jmod(String... args) { run("jmod", args); } void jpackage(String... args) { run("jpackage", args); } void javap(Class type) throws Exception { + if (type.isPrimitive() || type.isHidden() || type.isArray()) throw new IllegalArgumentException("Type has no class file: " + type); try { - var name = type.getCanonicalName(); - if (name == null) throw new IllegalArgumentException("Type not supported: " + type); + var name = type.getName(); if (type == Class.forName(name, false, ClassLoader.getSystemClassLoader())) { run("javap", "-c", "-v", "-s", name); return; diff --git a/test/langtools/jdk/jshell/ToolingTest.java b/test/langtools/jdk/jshell/ToolingTest.java index b36fdc03c1900..f0d0e3f68ebdb 100644 --- a/test/langtools/jdk/jshell/ToolingTest.java +++ b/test/langtools/jdk/jshell/ToolingTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,7 @@ /* * @test - * @bug 8306560 + * @bug 8306560 8365878 * @summary Tests for snippets and methods defined in TOOLING.jsh * @modules jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.main @@ -79,4 +79,31 @@ public void testDisassembleNewRecordClass() { ) ); } + + @Test + public void testDisassembleBuiltinInnerClass() { + test( + a -> assertCommand(a, "/open TOOLING", + ""), + a -> assertCommandUserOutputContains(a, "javap(Base64.Decoder.class)", + "Classfile jrt:/java.base/java/util/Base64$Decoder.class", + "class java.util.Base64$Decoder", + "SourceFile: \"Base64.java\"") + ); + } + + @Test + public void testDisassembleAnonymousClass() { + test( + a -> assertCommand(a, "Object o() {return new ArrayList<>(){ };}", // must be in a method or it won't be anonymous + "| created method o()"), + a -> assertCommand(a, "/open TOOLING", + ""), + a -> assertCommandUserOutputContains(a, "javap(o().getClass())", + "Classfile ", // Classfile /.../TOOLING-16063368030094702464.class + " extends java.util.ArrayList", // class REPL.$JShell$22$1 extends java.util.ArrayList + "SourceFile: \"$JShell$" // SourceFile: "$JShell$22.java" + ) + ); + } }