501 // This means a package-private superinterface exist in the unnamed
502 // package of a named module.
503 throw new InternalError("Unnamed package cannot be added to " + module);
504 }
505
506 if (!module.getDescriptor().packages().contains(packageName)) {
507 throw new InternalError(packageName + " not exist in " + module.getName());
508 }
509
510 if (!module.isOpen(packageName, Proxy.class.getModule())) {
511 // Required for default method invocation
512 throw new InternalError(packageName + " not open to " + Proxy.class.getModule());
513 }
514 } else {
515 if (Modifier.isPublic(accessFlags)) {
516 // All proxy superinterfaces are public, must be in named dynamic module
517 throw new InternalError("public proxy in unnamed module: " + module);
518 }
519 }
520
521 if ((accessFlags & ~Modifier.PUBLIC) != 0) {
522 throw new InternalError("proxy access flags must be Modifier.PUBLIC or 0");
523 }
524 }
525 }
526
527 private static Class<?> defineProxyClass(ProxyClassContext context, List<Class<?>> interfaces) {
528 /*
529 * Choose a name for the proxy class to generate.
530 */
531 long num = nextUniqueNumber.getAndIncrement();
532 String proxyName = context.packageName().isEmpty()
533 ? proxyClassNamePrefix + num
534 : context.packageName() + "." + proxyClassNamePrefix + num;
535
536 ClassLoader loader = getLoader(context.module());
537 trace(proxyName, context.module(), loader, interfaces);
538
539 /*
540 * Generate the specified proxy class.
541 */
542 byte[] proxyClassFile = ProxyGenerator.generateProxyClass(loader, proxyName, interfaces,
543 context.accessFlags() | Modifier.FINAL);
544 try {
545 Class<?> pc = JLA.defineClass(loader, proxyName, proxyClassFile,
546 null, "__dynamic_proxy__");
547 reverseProxyCache.sub(pc).putIfAbsent(loader, Boolean.TRUE);
548 return pc;
549 } catch (ClassFormatError e) {
550 /*
551 * A ClassFormatError here means that (barring bugs in the
552 * proxy class generation code) there was some other
553 * invalid aspect of the arguments supplied to the proxy
554 * class creation (such as virtual machine limitations
555 * exceeded).
556 */
557 throw new IllegalArgumentException(e.toString());
558 }
559 }
560
561 /**
562 * Test if given class is a class defined by
563 * {@link #defineProxyClass(ProxyClassContext, List)}
|
501 // This means a package-private superinterface exist in the unnamed
502 // package of a named module.
503 throw new InternalError("Unnamed package cannot be added to " + module);
504 }
505
506 if (!module.getDescriptor().packages().contains(packageName)) {
507 throw new InternalError(packageName + " not exist in " + module.getName());
508 }
509
510 if (!module.isOpen(packageName, Proxy.class.getModule())) {
511 // Required for default method invocation
512 throw new InternalError(packageName + " not open to " + Proxy.class.getModule());
513 }
514 } else {
515 if (Modifier.isPublic(accessFlags)) {
516 // All proxy superinterfaces are public, must be in named dynamic module
517 throw new InternalError("public proxy in unnamed module: " + module);
518 }
519 }
520
521 if ((accessFlags & ~(Modifier.PUBLIC | Modifier.IDENTITY)) != 0) {
522 throw new InternalError("proxy access flags must be Modifier.PUBLIC or 0");
523 }
524 }
525 }
526
527 private static Class<?> defineProxyClass(ProxyClassContext context, List<Class<?>> interfaces) {
528 /*
529 * Choose a name for the proxy class to generate.
530 */
531 long num = nextUniqueNumber.getAndIncrement();
532 String proxyName = context.packageName().isEmpty()
533 ? proxyClassNamePrefix + num
534 : context.packageName() + "." + proxyClassNamePrefix + num;
535
536 ClassLoader loader = getLoader(context.module());
537 trace(proxyName, context.module(), loader, interfaces);
538
539 /*
540 * Generate the specified proxy class.
541 */
542 byte[] proxyClassFile = ProxyGenerator.generateProxyClass(loader, proxyName, interfaces,
543 context.accessFlags() | Modifier.FINAL | Modifier.IDENTITY);
544 try {
545 Class<?> pc = JLA.defineClass(loader, proxyName, proxyClassFile,
546 null, "__dynamic_proxy__");
547 reverseProxyCache.sub(pc).putIfAbsent(loader, Boolean.TRUE);
548 return pc;
549 } catch (ClassFormatError e) {
550 /*
551 * A ClassFormatError here means that (barring bugs in the
552 * proxy class generation code) there was some other
553 * invalid aspect of the arguments supplied to the proxy
554 * class creation (such as virtual machine limitations
555 * exceeded).
556 */
557 throw new IllegalArgumentException(e.toString());
558 }
559 }
560
561 /**
562 * Test if given class is a class defined by
563 * {@link #defineProxyClass(ProxyClassContext, List)}
|