diff --git a/src/java.base/share/classes/java/lang/invoke/MethodHandles.java b/src/java.base/share/classes/java/lang/invoke/MethodHandles.java index 9f610844b01..8414eed8fe9 100644 --- a/src/java.base/share/classes/java/lang/invoke/MethodHandles.java +++ b/src/java.base/share/classes/java/lang/invoke/MethodHandles.java @@ -1631,7 +1631,7 @@ public class MethodHandles { } /** - * Creates a class or interface from {@code bytes} + * Creates and links a class or interface from {@code bytes} * with the same class loader and in the same runtime package and * {@linkplain java.security.ProtectionDomain protection domain} as this lookup's * {@linkplain #lookupClass() lookup class} as if calling diff --git a/test/jdk/java/lang/invoke/DefineClassTest.java b/test/jdk/java/lang/invoke/DefineClassTest.java index e16adb4dfb7..285d57d5201 100644 --- a/test/jdk/java/lang/invoke/DefineClassTest.java +++ b/test/jdk/java/lang/invoke/DefineClassTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2020, 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 @@ -237,6 +237,11 @@ public class DefineClassTest { lookup().defineClass(null); } + @Test(expectedExceptions = { NoClassDefFoundError.class }) + public void testLinking() throws Exception { + lookup().defineClass(generateNonLinkableClass(THIS_PACKAGE + ".NonLinkableClass")); + } + /** * Generates a class file with the given class name */ @@ -336,6 +341,31 @@ public class DefineClassTest { return cw.toByteArray(); } + /** + * Generates a non-linkable class file with the given class name + */ + byte[] generateNonLinkableClass(String className) { + ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + + ClassWriter.COMPUTE_FRAMES); + cw.visit(V14, + ACC_PUBLIC + ACC_SUPER, + className.replace(".", "/"), + null, + "MissingSuperClass", + null); + + // + MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "", "()V", null, null); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn(INVOKESPECIAL, "MissingSuperClass", "", "()V", false); + mv.visitInsn(RETURN); + mv.visitMaxs(0, 0); + mv.visitEnd(); + + cw.visitEnd(); + return cw.toByteArray(); + } + private int nextNumber() { return ++nextNumber; }