< prev index next > src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java
Print this page
import java.io.ObjectOutputStream;
import java.io.ObjectStreamClass;
import java.io.ObjectStreamField;
import java.io.OptionalDataException;
import java.io.Serializable;
- import java.lang.classfile.ClassFile;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.reflect.*;
import java.util.Set;
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))) {
} catch (ReflectiveOperationException e) {
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);
- }
-
//--------------------------------------------------------------------------
//
// Internals only below this point
//
< prev index next >