diff --git a/src/java.base/share/classes/java/lang/Module.java b/src/java.base/share/classes/java/lang/Module.java index aafe1b89a4b..84da07638c7 100644 --- a/src/java.base/share/classes/java/lang/Module.java +++ b/src/java.base/share/classes/java/lang/Module.java @@ -35,6 +35,7 @@ import java.lang.module.ModuleDescriptor.Exports; import java.lang.module.ModuleDescriptor.Opens; import java.lang.module.ModuleDescriptor.Version; import java.lang.module.ResolvedModule; +import java.lang.reflect.AccessFlag; import java.lang.reflect.AnnotatedElement; import java.net.URI; import java.net.URL; @@ -51,6 +52,13 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; +import jdk.internal.classfile.AccessFlags; +import jdk.internal.classfile.Attribute; +import jdk.internal.classfile.ClassModel; +import jdk.internal.classfile.ClassTransform; +import jdk.internal.classfile.Classfile; +import jdk.internal.classfile.attribute.ModuleAttribute; +import jdk.internal.classfile.attribute.RuntimeVisibleAnnotationsAttribute; import jdk.internal.javac.PreviewFeature; import jdk.internal.loader.BuiltinClassLoader; @@ -62,13 +70,6 @@ import jdk.internal.module.ModuleBootstrap; import jdk.internal.module.ModuleLoaderMap; import jdk.internal.module.ServicesCatalog; import jdk.internal.module.Resources; -import jdk.internal.org.objectweb.asm.AnnotationVisitor; -import jdk.internal.org.objectweb.asm.Attribute; -import jdk.internal.org.objectweb.asm.ClassReader; -import jdk.internal.org.objectweb.asm.ClassVisitor; -import jdk.internal.org.objectweb.asm.ClassWriter; -import jdk.internal.org.objectweb.asm.ModuleVisitor; -import jdk.internal.org.objectweb.asm.Opcodes; import jdk.internal.reflect.CallerSensitive; import jdk.internal.reflect.Reflection; import jdk.internal.vm.annotation.Stable; @@ -1589,47 +1590,17 @@ public final class Module implements AnnotatedElement { */ private Class loadModuleInfoClass(InputStream in) throws IOException { final String MODULE_INFO = "module-info"; - - ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS - + ClassWriter.COMPUTE_FRAMES); - - ClassVisitor cv = new ClassVisitor(Opcodes.ASM7, cw) { - @Override - public void visit(int version, - int access, - String name, - String signature, - String superName, - String[] interfaces) { - cw.visit(version, - Opcodes.ACC_INTERFACE - + Opcodes.ACC_ABSTRACT - + Opcodes.ACC_SYNTHETIC, - MODULE_INFO, - null, - "java/lang/Object", - null); - } - @Override - public AnnotationVisitor visitAnnotation(String desc, boolean visible) { + byte[] bytes = Classfile.parse(in.readAllBytes(), + Classfile.Option.constantPoolSharing(false)).transform((clb, cle) -> { + switch (cle) { + case AccessFlags af -> clb.withFlags(AccessFlag.INTERFACE, + AccessFlag.ABSTRACT, AccessFlag.SYNTHETIC); // keep annotations - return super.visitAnnotation(desc, visible); - } - @Override - public void visitAttribute(Attribute attr) { + case RuntimeVisibleAnnotationsAttribute a -> clb.with(a); // drop non-annotation attributes - } - @Override - public ModuleVisitor visitModule(String name, int flags, String version) { - // drop Module attribute - return null; - } - }; - - ClassReader cr = new ClassReader(in); - cr.accept(cv, 0); - byte[] bytes = cw.toByteArray(); - + case Attribute a -> {} + default -> clb.with(cle); + }}); ClassLoader cl = new ClassLoader(loader) { @Override protected Class findClass(String cn)throws ClassNotFoundException {