Package org.hibernate.internal.util
Class ReflectHelper
- java.lang.Object
-
- org.hibernate.internal.util.ReflectHelper
-
public final class ReflectHelper extends Object
Utility class for various reflection operations.
-
-
Field Summary
Fields Modifier and Type Field Description static Class<?>[]
NO_PARAM_SIGNATURE
static Class<?>[]
SINGLE_OBJECT_PARAM_SIGNATURE
-
Method Summary
All Methods Static Methods Concrete Methods Deprecated Methods Modifier and Type Method Description static void
checkGetAndIsVariants(Class<?> containerClass, String propertyName, Method getMethod, Method isMethod)
static Class<?>
classForName(String name)
Deprecated.Depending on context, eitherClassLoaderService
orClassLoaderAccess
should be preferredstatic Class<?>
classForName(String name, Class<?> caller)
Perform resolution of a class name.static void
ensureAccessibility(AccessibleObject accessibleObject)
static Method
extractEqualsMethod(Class<?> clazz)
Encapsulation of getting hold of a class'sequals
method.static Method
extractHashCodeMethod(Class<?> clazz)
Encapsulation of getting hold of a class'shashCode
method.static Field
findField(Class<?> containerClass, String propertyName)
static Method
findGetterMethod(Class<?> containerClass, String propertyName)
static Method
findGetterMethodForFieldAccess(Field field, String propertyName)
Similar togetterMethodOrNull(java.lang.Class<?>, java.lang.String)
, except that here we are just looking for the corresponding getter for a field (defined as field access) if one exists.static Method
findSetterMethod(Class<?> containerClass, String propertyName, Class<?> propertyType)
static <T> Class<T>
getClass(Type type)
static Constructor<?>
getConstructor(Class<?> clazz, Type[] types)
Deprecated, for removal: This API element is subject to removal in a future version.no longer used, since we moved away from theType
interfacestatic <T> Constructor<T>
getConstructorOrNull(Class<T> clazz, Class<?>... constructorArgs)
Retrieve a constructor for the given class, with arguments matching the specified Java types, or returnnull
if no such constructor exists.static <T> Constructor<T>
getDefaultConstructor(Class<T> clazz)
Retrieve the default (no arg) constructor from the given class.static <T> Supplier<T>
getDefaultSupplier(Class<T> clazz)
static Method
getGetterOrNull(Class<?> containerClass, String propertyName)
Find the method that can be used as the getter for this property.static Method
getMethod(Class<?> clazz, Method method)
static Method
getMethod(Class<?> clazz, String methodName, Class<?>... paramTypes)
static Class<?>
getPropertyType(Member member)
static String[]
getRecordComponentNames(Class<?> javaType)
static Class<?>[]
getRecordComponentTypes(Class<?> javaType)
static Method
getterMethodOrNull(Class<?> containerJavaType, String propertyName)
static boolean
implementsInterface(Class<?> clazz, Class<?> intf)
Determine if the given class implements the given interface.static boolean
isAbstractClass(Class<?> clazz)
Determine if the given class is declared abstract.static boolean
isClass(Class<?> resultClass)
static boolean
isFinalClass(Class<?> clazz)
Determine is the given class is declared final.static boolean
isPublic(Class<?> clazz, Member member)
Is this member publicly accessible.static boolean
isRecord(Class<?> declaringClass)
static boolean
isStaticField(Field field)
static boolean
overridesEquals(Class<?> clazz)
Determine if the given class defines anObject.equals(java.lang.Object)
override.static boolean
overridesHashCode(Class<?> clazz)
Determine if the given class defines aObject.hashCode()
override.static Class<?>
reflectedPropertyClass(Class<?> clazz, String name)
Attempt to resolve the specified property type through reflection.static Class<?>
reflectedPropertyClass(String className, String name, ClassLoaderService classLoaderService)
Attempt to resolve the specified property type through reflection.static Type
reflectedPropertyType(String className, String name, ClassLoaderService classLoaderService)
static Method
setterMethodOrNull(Class<?> containerClass, String propertyName, Class<?> propertyType)
static Method
setterMethodOrNullBySetterName(Class<?> containerClass, String setterName, Class<?> propertyType)
static void
verifyNoGetVariantExists(Class<?> containerClass, String propertyName, Method isMethod, String stemName)
static void
verifyNoIsVariantExists(Class<?> containerClass, String propertyName, Method getMethod, String stemName)
-
-
-
Method Detail
-
extractEqualsMethod
public static Method extractEqualsMethod(Class<?> clazz) throws NoSuchMethodException
Encapsulation of getting hold of a class'sequals
method.- Parameters:
clazz
- The class from which to extract the equals method.- Returns:
- The equals method reference
- Throws:
NoSuchMethodException
- Should indicate an attempt to extract equals method from interface.
-
extractHashCodeMethod
public static Method extractHashCodeMethod(Class<?> clazz) throws NoSuchMethodException
Encapsulation of getting hold of a class'shashCode
method.- Parameters:
clazz
- The class from which to extract the hashCode method.- Returns:
- The hashCode method reference
- Throws:
NoSuchMethodException
- Should indicate an attempt to extract hashCode method from interface.
-
overridesEquals
public static boolean overridesEquals(Class<?> clazz)
Determine if the given class defines anObject.equals(java.lang.Object)
override.- Parameters:
clazz
- The class to check- Returns:
- True if clazz defines an equals override.
-
overridesHashCode
public static boolean overridesHashCode(Class<?> clazz)
Determine if the given class defines aObject.hashCode()
override.- Parameters:
clazz
- The class to check- Returns:
- True if clazz defines an hashCode override.
-
implementsInterface
public static boolean implementsInterface(Class<?> clazz, Class<?> intf)
Determine if the given class implements the given interface.- Parameters:
clazz
- The class to checkintf
- The interface to check it against.- Returns:
- True if the class does implement the interface, false otherwise.
-
classForName
public static Class<?> classForName(String name, Class<?> caller) throws ClassNotFoundException
Perform resolution of a class name.Here we first check the context classloader, if one, before delegating to
Class.forName(String, boolean, ClassLoader)
using the caller's classloader- Parameters:
name
- The class namecaller
- The class from which this call originated (in order to access that class's loader).- Returns:
- The class reference.
- Throws:
ClassNotFoundException
- FromClass.forName(String, boolean, ClassLoader)
.
-
classForName
@Deprecated public static Class<?> classForName(String name) throws ClassNotFoundException
Deprecated.Depending on context, eitherClassLoaderService
orClassLoaderAccess
should be preferredPerform resolution of a class name.Same as
classForName(String, Class)
except that here we delegate toClass.forName(String)
if the context classloader lookup is unsuccessful.- Parameters:
name
- The class name- Returns:
- The class reference.
- Throws:
ClassNotFoundException
- FromClass.forName(String)
.
-
isPublic
public static boolean isPublic(Class<?> clazz, Member member)
Is this member publicly accessible.- Parameters:
clazz
- The class which defines the membermember
- The member.- Returns:
- True if the member is publicly accessible, false otherwise.
-
reflectedPropertyClass
public static Class<?> reflectedPropertyClass(String className, String name, ClassLoaderService classLoaderService) throws MappingException
Attempt to resolve the specified property type through reflection.- Parameters:
className
- The name of the class owning the property.name
- The name of the property.classLoaderService
- ClassLoader services- Returns:
- The type of the property.
- Throws:
MappingException
- Indicates we were unable to locate the property.
-
reflectedPropertyType
public static Type reflectedPropertyType(String className, String name, ClassLoaderService classLoaderService) throws MappingException
- Throws:
MappingException
-
reflectedPropertyClass
public static Class<?> reflectedPropertyClass(Class<?> clazz, String name) throws MappingException
Attempt to resolve the specified property type through reflection.- Parameters:
clazz
- The class owning the property.name
- The name of the property.- Returns:
- The type of the property.
- Throws:
MappingException
- Indicates we were unable to locate the property.
-
getDefaultConstructor
public static <T> Constructor<T> getDefaultConstructor(Class<T> clazz) throws PropertyNotFoundException
Retrieve the default (no arg) constructor from the given class.- Parameters:
clazz
- The class for which to retrieve the default ctor.- Returns:
- The default constructor.
- Throws:
PropertyNotFoundException
- Indicates there was not publicly accessible, no-arg constructor (todo : why PropertyNotFoundException???)
-
isAbstractClass
public static boolean isAbstractClass(Class<?> clazz)
Determine if the given class is declared abstract.- Parameters:
clazz
- The class to check.- Returns:
- True if the class is abstract, false otherwise.
-
isFinalClass
public static boolean isFinalClass(Class<?> clazz)
Determine is the given class is declared final.- Parameters:
clazz
- The class to check.- Returns:
- True if the class is final, false otherwise.
-
getConstructor
@Deprecated(since="6", forRemoval=true) public static Constructor<?> getConstructor(Class<?> clazz, Type[] types) throws PropertyNotFoundException
Deprecated, for removal: This API element is subject to removal in a future version.no longer used, since we moved away from theType
interfaceRetrieve a constructor for the given class, with arguments matching the specified Hibernate mapping types.- Parameters:
clazz
- The class needing instantiationtypes
- The types representing the required ctor param signature- Returns:
- The matching constructor
- Throws:
PropertyNotFoundException
- Indicates we could not locate an appropriate constructor
-
getConstructorOrNull
public static <T> Constructor<T> getConstructorOrNull(Class<T> clazz, Class<?>... constructorArgs)
Retrieve a constructor for the given class, with arguments matching the specified Java types, or returnnull
if no such constructor exists.- Parameters:
clazz
- The class needing instantiationconstructorArgs
- The types representing the required ctor param signature- Returns:
- The matching constructor, or
null
-
getMethod
public static Method getMethod(Class<?> clazz, String methodName, Class<?>... paramTypes)
-
ensureAccessibility
public static void ensureAccessibility(AccessibleObject accessibleObject)
-
isStaticField
public static boolean isStaticField(Field field)
-
findGetterMethod
public static Method findGetterMethod(Class<?> containerClass, String propertyName)
-
getGetterOrNull
public static Method getGetterOrNull(Class<?> containerClass, String propertyName)
Find the method that can be used as the getter for this property.- Parameters:
containerClass
- The Class> which contains the propertypropertyName
- The name of the property- Returns:
- The getter method, or
null
if there is none. - Throws:
MappingException
- If thecontainerClass
has both a get- and an is- form.
-
verifyNoIsVariantExists
public static void verifyNoIsVariantExists(Class<?> containerClass, String propertyName, Method getMethod, String stemName)
-
checkGetAndIsVariants
public static void checkGetAndIsVariants(Class<?> containerClass, String propertyName, Method getMethod, Method isMethod)
-
verifyNoGetVariantExists
public static void verifyNoGetVariantExists(Class<?> containerClass, String propertyName, Method isMethod, String stemName)
-
getterMethodOrNull
public static Method getterMethodOrNull(Class<?> containerJavaType, String propertyName)
-
setterMethodOrNull
public static Method setterMethodOrNull(Class<?> containerClass, String propertyName, Class<?> propertyType)
-
setterMethodOrNullBySetterName
public static Method setterMethodOrNullBySetterName(Class<?> containerClass, String setterName, Class<?> propertyType)
-
findSetterMethod
public static Method findSetterMethod(Class<?> containerClass, String propertyName, Class<?> propertyType)
-
findGetterMethodForFieldAccess
public static Method findGetterMethodForFieldAccess(Field field, String propertyName)
Similar togetterMethodOrNull(java.lang.Class<?>, java.lang.String)
, except that here we are just looking for the corresponding getter for a field (defined as field access) if one exists.We do not look at supers, although conceivably the super could declare the method as an abstract - but again, that is such an edge case...
-
isRecord
public static boolean isRecord(Class<?> declaringClass)
-
isClass
public static boolean isClass(Class<?> resultClass)
-
-