< prev index next >

src/java.base/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java

Print this page

295         ClassDesc interfaceDesc = classDesc(interfaceClass);
296         boolean accidentallySerializable = !isSerializable && Serializable.class.isAssignableFrom(interfaceClass);
297         if (altInterfaces.length == 0) {
298             interfaces = List.of(interfaceDesc);
299         } else {
300             // Assure no duplicate interfaces (ClassFormatError)
301             Set<ClassDesc> itfs = LinkedHashSet.newLinkedHashSet(altInterfaces.length + 1);
302             itfs.add(interfaceDesc);
303             for (Class<?> i : altInterfaces) {
304                 itfs.add(classDesc(i));
305                 accidentallySerializable |= !isSerializable && Serializable.class.isAssignableFrom(i);
306             }
307             interfaces = List.copyOf(itfs);
308         }
309         final boolean finalAccidentallySerializable = accidentallySerializable;
310         final byte[] classBytes = ClassFile.of().build(lambdaClassEntry, pool, new Consumer<ClassBuilder>() {
311             @Override
312             public void accept(ClassBuilder clb) {
313                 clb.withFlags(ACC_SUPER | ACC_FINAL | ACC_SYNTHETIC)
314                    .withInterfaceSymbols(interfaces);


315                 // Generate final fields to be filled in by constructor
316                 for (int i = 0; i < argDescs.length; i++) {
317                     clb.withField(argName(i), argDescs[i], ACC_PRIVATE | ACC_FINAL);
318                 }
319 
320                 generateConstructor(clb);
321 
322                 if (factoryType.parameterCount() == 0 && disableEagerInitialization) {
323                     generateClassInitializer(clb);
324                 }
325 
326                 // Forward the SAM method
327                 clb.withMethodBody(interfaceMethodName,
328                         methodDesc(interfaceMethodType),
329                         ACC_PUBLIC,
330                         forwardingMethod(interfaceMethodType));
331 
332                 // Forward the bridges
333                 if (altMethods != null) {
334                     for (MethodType mt : altMethods) {

295         ClassDesc interfaceDesc = classDesc(interfaceClass);
296         boolean accidentallySerializable = !isSerializable && Serializable.class.isAssignableFrom(interfaceClass);
297         if (altInterfaces.length == 0) {
298             interfaces = List.of(interfaceDesc);
299         } else {
300             // Assure no duplicate interfaces (ClassFormatError)
301             Set<ClassDesc> itfs = LinkedHashSet.newLinkedHashSet(altInterfaces.length + 1);
302             itfs.add(interfaceDesc);
303             for (Class<?> i : altInterfaces) {
304                 itfs.add(classDesc(i));
305                 accidentallySerializable |= !isSerializable && Serializable.class.isAssignableFrom(i);
306             }
307             interfaces = List.copyOf(itfs);
308         }
309         final boolean finalAccidentallySerializable = accidentallySerializable;
310         final byte[] classBytes = ClassFile.of().build(lambdaClassEntry, pool, new Consumer<ClassBuilder>() {
311             @Override
312             public void accept(ClassBuilder clb) {
313                 clb.withFlags(ACC_SUPER | ACC_FINAL | ACC_SYNTHETIC)
314                    .withInterfaceSymbols(interfaces);
315                 // All Classes in the BSM argument method types are loaded; no need for LoadableDescriptors
316 
317                 // Generate final fields to be filled in by constructor
318                 for (int i = 0; i < argDescs.length; i++) {
319                     clb.withField(argName(i), argDescs[i], ACC_PRIVATE | ACC_FINAL);
320                 }
321 
322                 generateConstructor(clb);
323 
324                 if (factoryType.parameterCount() == 0 && disableEagerInitialization) {
325                     generateClassInitializer(clb);
326                 }
327 
328                 // Forward the SAM method
329                 clb.withMethodBody(interfaceMethodName,
330                         methodDesc(interfaceMethodType),
331                         ACC_PUBLIC,
332                         forwardingMethod(interfaceMethodType));
333 
334                 // Forward the bridges
335                 if (altMethods != null) {
336                     for (MethodType mt : altMethods) {
< prev index next >