< 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 +522,27 @@
              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);
+         return AccessFlag.maskToAccessFlags(mask, location, classFileFormatVersion(classFile));
      }
  
-     private final ClassFileFormatVersion classFileFormatVersion(Class<?> cl) {
+     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 null; // preview or old preview, fallback to default handling
+             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 >