< prev index next >

src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java

Print this page
*** 197,10 ***
--- 197,13 ---
  
      public final Constructor<?> newConstructorForExternalization(Class<?> cl) {
          if (!Externalizable.class.isAssignableFrom(cl)) {
              return null;
          }
+         if (cl.isValue()) {
+             throw new UnsupportedOperationException("newConstructorForExternalization does not support value classes");
+         }
          try {
              Constructor<?> cons = cl.getConstructor();
              cons.setAccessible(true);
              return cons;
          } catch (NoSuchMethodException ex) {

*** 213,10 ***
--- 216,13 ---
      {
          if (constructorToCall.getDeclaringClass() == cl) {
              constructorToCall.setAccessible(true);
              return constructorToCall;
          }
+         if (cl.isValue()) {
+             throw new UnsupportedOperationException("newConstructorForSerialization does not support value classes");
+         }
          return generateConstructor(cl, constructorToCall);
      }
  
      /**
       * Given a class, determines whether its superclass has

*** 272,10 ***
--- 278,14 ---
       *
       * @param cl the class for which a constructor is to be found
       * @return the generated constructor, or null if none is available
       */
      public final Constructor<?> newConstructorForSerialization(Class<?> cl) {
+         if (cl.isValue()) {
+             throw new UnsupportedOperationException("newConstructorForSerialization does not support value classes: " + cl);
+         }
+ 
          Class<?> initCl = cl;
          while (Serializable.class.isAssignableFrom(initCl)) {
              Class<?> prev = initCl;
              if ((initCl = initCl.getSuperclass()) == null ||
                  (!disableSerialConstructorChecks() && !superHasAccessibleConstructor(prev))) {

*** 512,28 ***
              return null;
          }
      }
  
      public final Set<AccessFlag> parseAccessFlags(int mask, AccessFlag.Location location, Class<?> classFile) {
!         var cffv = classFileFormatVersion(classFile);
-         return cffv == null ?
-                 AccessFlag.maskToAccessFlags(mask, location) :
-                 AccessFlag.maskToAccessFlags(mask, location, cffv);
      }
  
!     private final ClassFileFormatVersion classFileFormatVersion(Class<?> cl) {
          int raw = SharedSecrets.getJavaLangAccess().classFileVersion(cl);
  
          int major = raw & 0xFFFF;
          int minor = raw >>> Character.SIZE;
  
          assert VM.isSupportedClassFileVersion(major, minor) : major + "." + minor;
  
          if (major >= ClassFile.JAVA_12_VERSION) {
              if (minor == 0)
                  return ClassFileFormatVersion.fromMajor(raw);
!             return null; // preview or old preview, fallback to default handling
          } else if (major == ClassFile.JAVA_1_VERSION) {
              return minor < 3 ? ClassFileFormatVersion.RELEASE_0 : ClassFileFormatVersion.RELEASE_1;
          }
          return ClassFileFormatVersion.fromMajor(major);
      }
--- 522,27 ---
              return null;
          }
      }
  
      public final Set<AccessFlag> parseAccessFlags(int mask, AccessFlag.Location location, Class<?> classFile) {
!         return AccessFlag.maskToAccessFlags(mask, location, classFileFormatVersion(classFile));
      }
  
!     public final ClassFileFormatVersion classFileFormatVersion(Class<?> cl) {
+         if (cl.isArray() || cl.isPrimitive())
+             return ClassFileFormatVersion.CURRENT_PREVIEW_FEATURES;
          int raw = SharedSecrets.getJavaLangAccess().classFileVersion(cl);
  
          int major = raw & 0xFFFF;
          int minor = raw >>> Character.SIZE;
  
          assert VM.isSupportedClassFileVersion(major, minor) : major + "." + minor;
  
          if (major >= ClassFile.JAVA_12_VERSION) {
              if (minor == 0)
                  return ClassFileFormatVersion.fromMajor(raw);
!             return ClassFileFormatVersion.CURRENT_PREVIEW_FEATURES;
          } else if (major == ClassFile.JAVA_1_VERSION) {
              return minor < 3 ? ClassFileFormatVersion.RELEASE_0 : ClassFileFormatVersion.RELEASE_1;
          }
          return ClassFileFormatVersion.fromMajor(major);
      }
< prev index next >