< prev index next > src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java
Print this page
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) {
{
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
*
* @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))) {
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);
}
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 >