mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 14:54:52 +02:00
8294959: java.base java.lang.Module uses ASM to load module-info.class
Reviewed-by: mchung
This commit is contained in:
parent
68b5eef44f
commit
595645c76d
1 changed files with 17 additions and 46 deletions
|
@ -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 {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue