package org.springframework.util;
Miscellaneous class utility methods. Mainly for internal use within the
framework; consider Jakarta's Commons Lang for a more comprehensive suite
of class utilities.
Suffix for array class names: "[]"
Prefix for internal array class names: "[L"
The package separator character '.'
The inner class separator character '$'
The CGLIB class separator character "$$"
Map with primitive wrapper type as key and corresponding primitive
type as value, for example: Integer.class -> int.class.
Map with primitive type name as key and corresponding primitive
type as value, for example: "int" -> "int.class".
boolean[].class, byte[].class, char[].class, double[].class,
float[].class, int[].class, long[].class, short[].class}));
Return the default ClassLoader to use: typically the thread context
ClassLoader, if available; the ClassLoader that loaded the ClassUtils
class will be used as fallback.
Call this method if you intend to use the thread context ClassLoader
in a scenario where you absolutely need a non-null ClassLoader reference:
for example, for class path resource loading (but not necessarily for
Class.forName, which accepts a null ClassLoader
reference as well).
Override the thread context ClassLoader with the environment's bean ClassLoader
if necessary, i.e. if the bean ClassLoader is not equivalent to the thread
context ClassLoader already.
- Parameters:
classLoaderToUse the actual ClassLoader to use for the thread context- Returns:
- the original thread context ClassLoader, or
null if not overridden
if (classLoaderToUse != null && !classLoaderToUse.equals(threadContextClassLoader)) { return threadContextClassLoader;
Determine whether the
java.lang.Class identified by the supplied name is present
and can be loaded. Will return
false if either the class or
one of its dependencies is not present or cannot be loaded.
- Parameters:
className the name of the class to check- Returns:
- whether the specified class is present
Determine whether the
java.lang.Class identified by the supplied name is present
and can be loaded. Will return
false if either the class or
one of its dependencies is not present or cannot be loaded.
- Parameters:
className the name of the class to checkclassLoader the class loader to use
(may be null, which indicates the default class loader)- Returns:
- whether the specified class is present
Replacement for
Class.forName() that also returns Class instances
for primitives (like "int") and array class names (like "String[]").
Always uses the default class loader: that is, preferably the thread context
class loader, or the ClassLoader that loaded the ClassUtils class as fallback.
Replacement for
Class.forName() that also returns Class instances
for primitives (like "int") and array class names (like "String[]").
Assert.notNull(name, "Name must not be null");
Class elementClass = forName(elementClassName, classLoader);
if (internalArrayMarker != -1 && name.endsWith(";")) { String elementClassName = null;
if (internalArrayMarker == 0) { Class elementClass = forName(elementClassName, classLoader);
if (classLoaderToUse == null) { Resolve the given class name into a Class instance. Supports
primitives (like "int") and array class names (like "String[]").
This is effectively equivalent to the forName
method with the same arguments, with the only difference being
the exceptions thrown in case of class loading failure.
return forName(className, classLoader);
"Error loading class [" + className + "]: problem with class file or dependent class.");
Resolve the given class name as primitive class, if appropriate,
according to the JVM's naming rules for primitive classes.
Also supports the JVM's internal class names for primitive arrays.
Does not support the "[]" suffix notation for primitive arrays;
this is only supported by forName(java.lang.String).
- Parameters:
name the name of the potentially primitive class- Returns:
- the primitive class, or
null if the name does not denote
a primitive class or primitive array class
if (name != null && name.length() <= 8) { Return the user-defined class for the given instance: usually simply
the class of the given instance, but the original class in case of a
CGLIB-generated subclass.
- Parameters:
instance the instance to check- Returns:
- the user-defined class
Assert.notNull(instance, "Instance must not be null");
Return the user-defined class for the given class: usually simply the given
class, but the original class in case of a CGLIB-generated subclass.
- Parameters:
clazz the class to check- Returns:
- the user-defined class
Check whether the given class is cache-safe in the given context,
i.e. whether it is loaded by the given ClassLoader or a parent of it.
- Parameters:
clazz the class to analyzeclassLoader the ClassLoader to potentially cache metadata in
Assert.notNull(clazz, "Class must not be null");
Get the class name without the qualified package name.
- Parameters:
className the className to get the short name for- Returns:
- the class name of the class without the package name
- Throws:
java.lang.IllegalArgumentException if the className is empty
Assert.hasLength(className, "Class name must not be empty");
if (nameEndIndex == -1) { nameEndIndex = className.length();
Get the class name without the qualified package name.
- Parameters:
clazz the class to get the short name for- Returns:
- the class name of the class without the package name
Return the short string name of a Java class in decapitalized JavaBeans
property format. Strips the outer class name in case of an inner class.
shortName = (dotIndex != -1 ? shortName.substring(dotIndex + 1) : shortName);
Determine the name of the class file, relative to the containing
package: e.g. "String.class"
- Parameters:
clazz the class- Returns:
- the file name of the ".class" file
Assert.notNull(clazz, "Class must not be null");
Determine the name of the package of the given class:
e.g. "java.lang" for the
java.lang.String class.
- Parameters:
clazz the class- Returns:
- the package name, or the empty String if the class
is defined in the default package
Assert.notNull(clazz, "Class must not be null");
return (lastDotIndex != -1 ? className.substring(0, lastDotIndex) : "");
Return the qualified name of the given class: usually simply
the class name, but component type class name + "[]" for arrays.
- Parameters:
clazz the class- Returns:
- the qualified name of the class
Assert.notNull(clazz, "Class must not be null");
Build a nice qualified name for an array:
component type class name + "[]".
- Parameters:
clazz the array class- Returns:
- a qualified name for the array class
Return the qualified name of the given method, consisting of
fully qualified interface/class name + "." + method name.
- Parameters:
method the method- Returns:
- the qualified name of the method
Assert.notNull(method, "Method must not be null");
Return a descriptive name for the given object's type: usually simply
the class name, but component type class name + "[]" for arrays,
and an appended list of implemented interfaces for JDK proxies.
- Parameters:
value the value to introspect- Returns:
- the qualified name of the class
for (int i = 0; i < ifcs.length; i++) { if (i < ifcs.length - 1) { Determine whether the given class has a constructor with the given signature.
Essentially translates NoSuchMethodException to "false".
Determine whether the given class has a constructor with the given signature,
and return it if available (else return
null).
Essentially translates NoSuchMethodException to null.
Assert.notNull(clazz, "Class must not be null");
Determine whether the given class has a method with the given signature.
Essentially translates NoSuchMethodException to "false".
Determine whether the given class has a method with the given signature,
and return it if available (else return
null).
Essentially translates NoSuchMethodException to null.
Assert.notNull(clazz, "Class must not be null");
Assert.notNull(methodName, "Method name must not be null");
return clazz.getMethod(methodName, paramTypes);
Return the number of methods with a given name (with any argument types),
for the given class and/or its superclasses. Includes non-public methods.
- Parameters:
clazz the clazz to checkmethodName the name of the method- Returns:
- the number of methods with the given name
Assert.notNull(clazz, "Class must not be null");
Assert.notNull(methodName, "Method name must not be null");
for (int i = 0; i < declaredMethods.length; i++) { Method method = declaredMethods[i];
for (int i = 0; i < ifcs.length; i++) { Does the given class and/or its superclasses at least have one or more
methods (with any argument types)? Includes non-public methods.
- Parameters:
clazz the clazz to checkmethodName the name of the method- Returns:
- whether there is at least one method with the given name
Assert.notNull(clazz, "Class must not be null");
Assert.notNull(methodName, "Method name must not be null");
for (int i = 0; i < declaredMethods.length; i++) { Method method = declaredMethods[i];
for (int i = 0; i < ifcs.length; i++) { Given a method, which may come from an interface, and a target class used
in the current reflective invocation, find the corresponding target method
if there is one. E.g. the method may be
IFoo.bar() and the
target class may be
DefaultFoo. In this case, the method may be
DefaultFoo.bar(). This enables attributes on that method to be found.
NOTE: In contrast to org.springframework.aop.support.AopUtils,
this method does not resolve Java 5 bridge methods automatically.
Call org.springframework.core.BridgeMethodResolver.findBridgedMethod(java.lang.reflect.Method)
if bridge method resolution is desirable (e.g. for obtaining metadata from
the original method definition).
- Parameters:
method the method to be invoked, which may come from an interfacetargetClass the target class for the current invocation.
May be null or may not even implement the method.- Returns:
- the specific target method, or the original method if the
targetClass doesn't implement it or is null - See also:
org.springframework.aop.support.AopUtils.getMostSpecificMethod
Return a static method of a class.
- Parameters:
methodName the static method nameclazz the class which defines the methodargs the parameter types to the method- Returns:
- the static method, or
null if no static method was found - Throws:
java.lang.IllegalArgumentException if the method name is blank or the clazz is null
Assert.notNull(clazz, "Class must not be null");
Assert.notNull(methodName, "Method name must not be null");
Check if the given class represents a primitive wrapper,
i.e. Boolean, Byte, Character, Short, Integer, Long, Float, or Double.
- Parameters:
clazz the class to check- Returns:
- whether the given class is a primitive wrapper class
Assert.notNull(clazz, "Class must not be null");
Check if the given class represents a primitive (i.e. boolean, byte,
char, short, int, long, float, or double) or a primitive wrapper
(i.e. Boolean, Byte, Character, Short, Integer, Long, Float, or Double).
- Parameters:
clazz the class to check- Returns:
- whether the given class is a primitive or primitive wrapper class
Assert.notNull(clazz, "Class must not be null");
Check if the given class represents an array of primitives,
i.e. boolean, byte, char, short, int, long, float, or double.
- Parameters:
clazz the class to check- Returns:
- whether the given class is a primitive array class
Assert.notNull(clazz, "Class must not be null");
Check if the given class represents an array of primitive wrappers,
i.e. Boolean, Byte, Character, Short, Integer, Long, Float, or Double.
- Parameters:
clazz the class to check- Returns:
- whether the given class is a primitive wrapper array class
Assert.notNull(clazz, "Class must not be null");
Check if the right-hand side type may be assigned to the left-hand side
type, assuming setting by reflection. Considers primitive wrapper
classes as assignable to the corresponding primitive types.
Assert.notNull(lhsType, "Left-hand side type must not be null");
Assert.notNull(rhsType, "Right-hand side type must not be null");
Determine if the given type is assignable from the given value,
assuming setting by reflection. Considers primitive wrapper classes
as assignable to the corresponding primitive types.
- Parameters:
type the target typevalue the value that should be assigned to the type- Returns:
- if the type is assignable from the value
Assert.notNull(type, "Type must not be null");
Convert a "/"-based resource path to a "."-based fully qualified class name.
- Parameters:
resourcePath the resource path pointing to a class- Returns:
- the corresponding fully qualified class name
return resourcePath.replace('/', '.'); Convert a "."-based fully qualified class name to a "/"-based resource path.
- Parameters:
className the fully qualified class name- Returns:
- the corresponding resource path, pointing to the class
return className.replace('.', '/'); Return a path suitable for use with
ClassLoader.getResource
(also suitable for use with
Class.getResource by prepending a
slash ('/') to the return value. Built by taking the package of the specified
class file, converting all dots ('.') to slashes ('/'), adding a trailing slash
if necesssary, and concatenating the specified resource name to this.
As such, this function may be used to build a path suitable for
loading a resource file that is in the same package as a class file,
although
org.springframework.core.io.ClassPathResource is usually
even more convenient.
Assert.notNull(resourceName, "Resource name must not be null");
Given an input class object, return a string which consists of the
class's package name as a pathname, i.e., all dots ('.') are replaced by
slashes ('/'). Neither a leading nor trailing slash is added. The result
could be concatenated with a slash and the name of a resource, and fed
directly to
ClassLoader.getResource(). For it to be fed to
Class.getResource instead, a leading slash would also have
to be prepended to the returned value.
if (packageEndIndex == -1) { return packageName.replace('.', '/'); Build a String that consists of the names of the classes/interfaces
in the given array.
Basically like AbstractCollection.toString(), but stripping
the "class "/"interface " prefix before every class name.
Build a String that consists of the names of the classes/interfaces
in the given collection.
Basically like AbstractCollection.toString(), but stripping
the "class "/"interface " prefix before every class name.
if (CollectionUtils.isEmpty(classes)) { Return all interfaces that the given instance implements as array,
including ones implemented by superclasses.
- Parameters:
instance the instance to analyse for interfaces- Returns:
- all interfaces that the given instance implements as array
Assert.notNull(instance, "Instance must not be null");
Return all interfaces that the given class implements as array,
including ones implemented by superclasses.
If the class itself is an interface, it gets returned as sole interface.
- Parameters:
clazz the class to analyse for interfaces- Returns:
- all interfaces that the given object implements as array
Return all interfaces that the given class implements as array,
including ones implemented by superclasses.
If the class itself is an interface, it gets returned as sole interface.
- Parameters:
clazz the class to analyse for interfacesclassLoader the ClassLoader that the interfaces need to be visible in
(may be null when accepting all declared interfaces)- Returns:
- all interfaces that the given object implements as array
Assert.notNull(clazz, "Class must not be null");
return new Class[] {clazz}; (classLoader == null || isVisible(ifc, classLoader))) { Return all interfaces that the given instance implements as Set,
including ones implemented by superclasses.
- Parameters:
instance the instance to analyse for interfaces- Returns:
- all interfaces that the given instance implements as Set
Assert.notNull(instance, "Instance must not be null");
Return all interfaces that the given class implements as Set,
including ones implemented by superclasses.
If the class itself is an interface, it gets returned as sole interface.
- Parameters:
clazz the class to analyse for interfaces- Returns:
- all interfaces that the given object implements as Set
Return all interfaces that the given class implements as Set,
including ones implemented by superclasses.
If the class itself is an interface, it gets returned as sole interface.
- Parameters:
clazz the class to analyse for interfacesclassLoader the ClassLoader that the interfaces need to be visible in
(may be null when accepting all declared interfaces)- Returns:
- all interfaces that the given object implements as Set
Assert.notNull(clazz, "Class must not be null");
if (classLoader == null || isVisible(ifc, classLoader)) { Create a composite interface Class for the given interfaces,
implementing the given interfaces in one single Class.
This implementation builds a JDK proxy class for the given interfaces.
Assert.notEmpty(interfaces, "Interfaces must not be empty");
Assert.notNull(classLoader, "ClassLoader must not be null");
Check whether the given class is visible in the given ClassLoader.
- Parameters:
clazz the class to check (typically an interface)classLoader the ClassLoader to check against (may be null,
in which case this method will always return true)
if (classLoader == null) { return (clazz == actualClass);