On Wed, 6 Sep 2023 22:05:47 GMT, Chen Liang <li...@openjdk.org> wrote:

>> This reimplements 
>> `sun.reflect.ReflectionFactory::newConstructorForSerialization` with method 
>> handles.
>> 
>> This API currently generates the bytecode which fails the verification 
>> because `new C; invokespecial A()` where the given class `C` and invoke a 
>> no-arg constructor of `C`'s first non-`Serializable` superclass `A` is not a 
>> valid operation per the VM specification. VM special cases the classes 
>> generated for reflection to skip verification for the constructors generated 
>> for serialization and externalization.  This change will allow such VM hack 
>> to be removed.
>> 
>> A `jdk.reflect.useOldSerializableConstructor` system property can be set to 
>> use the old implementation in case if customers run into any compatibility 
>> issue.   I expect this change has very low compatibility risk.   This system 
>> property is undocumented and will be removed in a future release.
>
> src/java.base/share/classes/jdk/internal/reflect/MethodHandleAccessorFactory.java
>  line 127:
> 
>> 125:     static ConstructorAccessorImpl 
>> newSerializableConstructorAccessor(Class<?> decl, Constructor<?> ctor) {
>> 126:         if (!constructorInSuperclass(decl, ctor)) {
>> 127:             throw new UnsupportedOperationException(ctor + " not a 
>> superclass of " + decl.getName());
> 
> Notice in JShell 20, you could do this:
> 
> jshell> import sun.reflect.ReflectionFactory;
> jshell> var rf = ReflectionFactory.getReflectionFactory()
> jshell> var c = rf.newConstructorForSerialization(String.class, 
> Boolean.class.getConstructor(boolean.class))
> jshell> String d = (String) c.newInstance(false)
> jshell> d.length()
> 
> which ends up in an NPE for `d.value` is null. This UOE is technically a new 
> behavior that should be mentioned in the CSR.

good catch.  will update the CSR.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/15600#discussion_r1317900597

Reply via email to