HHH-15624 java.lang.ClassCastException: class sun.reflect.generics.reflectiveObjects.WildcardTypeImpl cannot be cast to class java.lang.reflect.ParameterizedType when using generics and Wildcard

This commit is contained in:
Andrea Boriero 2022-11-14 12:23:21 +01:00 committed by Andrea Boriero
parent 8f2c3cc615
commit 385926e61b
2 changed files with 6 additions and 11 deletions

View File

@ -14,6 +14,7 @@ import java.lang.reflect.Member;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType; import java.lang.reflect.ParameterizedType;
import java.lang.reflect.WildcardType;
import java.util.Locale; import java.util.Locale;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import jakarta.persistence.Transient; import jakarta.persistence.Transient;
@ -23,7 +24,6 @@ import org.hibernate.MappingException;
import org.hibernate.PropertyNotFoundException; import org.hibernate.PropertyNotFoundException;
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
import org.hibernate.boot.registry.classloading.spi.ClassLoadingException; import org.hibernate.boot.registry.classloading.spi.ClassLoadingException;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.internal.util.collections.ArrayHelper; import org.hibernate.internal.util.collections.ArrayHelper;
import org.hibernate.property.access.internal.PropertyAccessStrategyMixedImpl; import org.hibernate.property.access.internal.PropertyAccessStrategyMixedImpl;
import org.hibernate.property.access.spi.Getter; import org.hibernate.property.access.spi.Getter;
@ -867,6 +867,9 @@ public final class ReflectHelper {
else if ( type instanceof ParameterizedType ) { else if ( type instanceof ParameterizedType ) {
return (Class<T>) ( (ParameterizedType) type ).getRawType(); return (Class<T>) ( (ParameterizedType) type ).getRawType();
} }
else if ( type instanceof WildcardType ) {
return getClass( ( (WildcardType) type ).getUpperBounds()[0] );
}
throw new UnsupportedOperationException( "Can't get java type class from type: " + type ); throw new UnsupportedOperationException( "Can't get java type class from type: " + type );
} }
} }

View File

@ -7,13 +7,13 @@
package org.hibernate.type.descriptor.java.spi; package org.hibernate.type.descriptor.java.spi;
import java.io.Serializable; import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Supplier; import java.util.function.Supplier;
import org.hibernate.annotations.Immutable; import org.hibernate.annotations.Immutable;
import org.hibernate.annotations.Mutability; import org.hibernate.annotations.Mutability;
import org.hibernate.internal.util.ReflectHelper;
import org.hibernate.resource.beans.spi.ManagedBean; import org.hibernate.resource.beans.spi.ManagedBean;
import org.hibernate.resource.beans.spi.ManagedBeanRegistry; import org.hibernate.resource.beans.spi.ManagedBeanRegistry;
import org.hibernate.type.descriptor.java.EnumJavaType; import org.hibernate.type.descriptor.java.EnumJavaType;
@ -106,14 +106,6 @@ public class RegistryHelper {
} }
private <J> Class<J> determineJavaTypeClass(Type javaType) { private <J> Class<J> determineJavaTypeClass(Type javaType) {
final Class<J> javaTypeClass; return ReflectHelper.getClass( javaType );
if ( javaType instanceof Class<?> ) {
javaTypeClass = (Class<J>) javaType;
}
else {
final ParameterizedType parameterizedType = (ParameterizedType) javaType;
javaTypeClass = (Class<J>) parameterizedType.getRawType();
}
return javaTypeClass;
} }
} }