Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright 2002-2008 the original author or authors.
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 
 package org.springframework.util;
 
 import java.util.List;
 import java.util.Map;
 import java.util.Set;

Miscellaneous class utility methods. Mainly for internal use within the framework; consider Jakarta's Commons Lang for a more comprehensive suite of class utilities.

Author(s):
Keith Donald
Rob Harrop
Juergen Hoeller
Since:
1.1
See also:
TypeUtils
ReflectionUtils
 
 public abstract class ClassUtils {

Suffix for array class names: "[]"
 
 	public static final String ARRAY_SUFFIX = "[]";

Prefix for internal array class names: "[L"
 
 	private static final String INTERNAL_ARRAY_PREFIX = "[L";

The package separator character '.'
 
 	private static final char PACKAGE_SEPARATOR = '.';

The inner class separator character '$'
 
 	private static final char INNER_CLASS_SEPARATOR = '$';

The CGLIB class separator character "$$"
 
 	public static final String CGLIB_CLASS_SEPARATOR = "$$";

The ".class" file suffix
 
 	public static final String CLASS_FILE_SUFFIX = ".class";


Map with primitive wrapper type as key and corresponding primitive type as value, for example: Integer.class -> int.class.
 
 	private static final Map primitiveWrapperTypeMap = new HashMap(8);

Map with primitive type name as key and corresponding primitive type as value, for example: "int" -> "int.class".
 
 	private static final Map primitiveTypeNameMap = new HashMap(16);
 
 
 	static {
 		.put(Boolean.classboolean.class);
 		.put(Byte.classbyte.class);
 		.put(Character.classchar.class);
 		.put(Double.classdouble.class);
 		.put(Float.classfloat.class);
 		.put(Integer.classint.class);
 		.put(Long.classlong.class);
 		.put(Short.classshort.class);
 
 		Set primitiveTypeNames = new HashSet(16);
 		primitiveTypeNames.addAll(.values());
 		primitiveTypeNames.addAll(Arrays.asList(new Class[] {
 				boolean[].classbyte[].classchar[].classdouble[].class,
 				float[].classint[].classlong[].classshort[].class}));
 		for (Iterator it = primitiveTypeNames.iterator(); it.hasNext();) {
 			Class primitiveClass = (Classit.next();
			.put(primitiveClass.getName(), primitiveClass);
		}
	}


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).

Returns:
the default ClassLoader (never null)
See also:
java.lang.Thread.getContextClassLoader()
	public static ClassLoader getDefaultClassLoader() {
		ClassLoader cl = null;
		try {
		}
		catch (Throwable ex) {
			// Cannot access thread context ClassLoader - falling back to system class loader...
		}
		if (cl == null) {
			// No thread context class loader -> use class loader of this class.
			cl = ClassUtils.class.getClassLoader();
		}
		return cl;
	}

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
	public static ClassLoader overrideThreadContextClassLoader(ClassLoader classLoaderToUse) {
		Thread currentThread = Thread.currentThread();
		ClassLoader threadContextClassLoader = currentThread.getContextClassLoader();
		if (classLoaderToUse != null && !classLoaderToUse.equals(threadContextClassLoader)) {
			currentThread.setContextClassLoader(classLoaderToUse);
			return threadContextClassLoader;
		}
		else {
			return null;
		}
	}

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
	public static boolean isPresent(String className) {
		return isPresent(classNamegetDefaultClassLoader());
	}

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
classLoader the class loader to use (may be null, which indicates the default class loader)
Returns:
whether the specified class is present
	public static boolean isPresent(String classNameClassLoader classLoader) {
		try {
			forName(classNameclassLoader);
			return true;
		}
		catch (Throwable ex) {
			// Class or one of its dependencies is not present...
			return false;
		}
	}

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.

Parameters:
name the name of the Class
Returns:
Class instance for the supplied name
Throws:
java.lang.ClassNotFoundException if the class was not found
java.lang.LinkageError if the class file could not be loaded
See also:
java.lang.Class.forName(java.lang.String,boolean,java.lang.ClassLoader)
getDefaultClassLoader()
	public static Class forName(String namethrows ClassNotFoundExceptionLinkageError {
		return forName(namegetDefaultClassLoader());
	}

Replacement for Class.forName() that also returns Class instances for primitives (like "int") and array class names (like "String[]").

Parameters:
name the name of the Class
classLoader the class loader to use (may be null, which indicates the default class loader)
Returns:
Class instance for the supplied name
Throws:
java.lang.ClassNotFoundException if the class was not found
java.lang.LinkageError if the class file could not be loaded
See also:
java.lang.Class.forName(java.lang.String,boolean,java.lang.ClassLoader)
	public static Class forName(String nameClassLoader classLoaderthrows ClassNotFoundExceptionLinkageError {
		Assert.notNull(name"Name must not be null");
		if (clazz != null) {
			return clazz;
		}
		// "java.lang.String[]" style arrays
		if (name.endsWith()) {
			String elementClassName = name.substring(0, name.length() - .length());
			Class elementClass = forName(elementClassNameclassLoader);
			return Array.newInstance(elementClass, 0).getClass();
		}
		// "[Ljava.lang.String;" style arrays
		int internalArrayMarker = name.indexOf();
		if (internalArrayMarker != -1 && name.endsWith(";")) {
			String elementClassName = null;
			if (internalArrayMarker == 0) {
				elementClassName = name.substring(.length(), name.length() - 1);
			}
			else if (name.startsWith("[")) {
				elementClassName = name.substring(1);
			}
			Class elementClass = forName(elementClassNameclassLoader);
			return Array.newInstance(elementClass, 0).getClass();
		}
		ClassLoader classLoaderToUse = classLoader;
		if (classLoaderToUse == null) {
			classLoaderToUse = getDefaultClassLoader();
		}
		return classLoaderToUse.loadClass(name);
	}

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.

Parameters:
className the name of the Class
classLoader the class loader to use (may be null, which indicates the default class loader)
Returns:
Class instance for the supplied name
Throws:
java.lang.IllegalArgumentException if the class name was not resolvable (that is, the class could not be found or the class file could not be loaded)
See also:
forName(java.lang.String,java.lang.ClassLoader)
	public static Class resolveClassName(String classNameClassLoader classLoaderthrows IllegalArgumentException {
		try {
			return forName(classNameclassLoader);
		}
		catch (ClassNotFoundException ex) {
			IllegalArgumentException iae = new IllegalArgumentException("Cannot find class [" + className + "]");
			iae.initCause(ex);
			throw iae;
		}
		catch (LinkageError ex) {
					"Error loading class [" + className + "]: problem with class file or dependent class.");
			iae.initCause(ex);
			throw iae;
		}
	}

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
	public static Class resolvePrimitiveClassName(String name) {
		Class result = null;
		// Most class names will be quite long, considering that they
		// SHOULD sit in a package, so a length check is worthwhile.
		if (name != null && name.length() <= 8) {
			// Could be a primitive - likely.
			result = (Class.get(name);
		}
		return result;
	}

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
	public static Class getUserClass(Object instance) {
		Assert.notNull(instance"Instance must not be null");
		return getUserClass(instance.getClass());
	}

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
	public static Class getUserClass(Class clazz) {
		return (clazz != null && clazz.getName().indexOf() != -1 ?
				clazz.getSuperclass() : clazz);
	}

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 analyze
classLoader the ClassLoader to potentially cache metadata in
	public static boolean isCacheSafe(Class clazzClassLoader classLoader) {
		Assert.notNull(clazz"Class must not be null");
		ClassLoader target = clazz.getClassLoader();
		if (target == null) {
			return false;
		}
		ClassLoader cur = classLoader;
		if (cur == target) {
			return true;
		}
		while (cur != null) {
			cur = cur.getParent();
			if (cur == target) {
				return true;
			}
		}
		return false;
	}


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
	public static String getShortName(String className) {
		Assert.hasLength(className"Class name must not be empty");
		int lastDotIndex = className.lastIndexOf();
		int nameEndIndex = className.indexOf();
		if (nameEndIndex == -1) {
			nameEndIndex = className.length();
		}
		String shortName = className.substring(lastDotIndex + 1, nameEndIndex);
		return shortName;
	}

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
	public static String getShortName(Class clazz) {
	}

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.

Parameters:
clazz the class
Returns:
the short name rendered in a standard JavaBeans property format
See also:
java.beans.Introspector.decapitalize(java.lang.String)
	public static String getShortNameAsProperty(Class clazz) {
		String shortName = ClassUtils.getShortName(clazz);
		int dotIndex = shortName.lastIndexOf('.');
		shortName = (dotIndex != -1 ? shortName.substring(dotIndex + 1) : shortName);
		return Introspector.decapitalize(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
	public static String getClassFileName(Class clazz) {
		Assert.notNull(clazz"Class must not be null");
		String className = clazz.getName();
		int lastDotIndex = className.lastIndexOf();
		return className.substring(lastDotIndex + 1) + ;
	}

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
	public static String getPackageName(Class clazz) {
		Assert.notNull(clazz"Class must not be null");
		String className = clazz.getName();
		int lastDotIndex = className.lastIndexOf();
		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
	public static String getQualifiedName(Class clazz) {
		Assert.notNull(clazz"Class must not be null");
		if (clazz.isArray()) {
		}
		else {
			return clazz.getName();
		}
	}

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
	private static String getQualifiedNameForArray(Class clazz) {
		StringBuffer buffer = new StringBuffer();
		while (clazz.isArray()) {
			clazz = clazz.getComponentType();
		}
		buffer.insert(0, clazz.getName());
		return buffer.toString();
	}

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
	public static String getQualifiedMethodName(Method method) {
		Assert.notNull(method"Method must not be null");
		return method.getDeclaringClass().getName() + "." + method.getName();
	}

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
	public static String getDescriptiveType(Object value) {
		if (value == null) {
			return null;
		}
		Class clazz = value.getClass();
		if (Proxy.isProxyClass(clazz)) {
			StringBuffer buf = new StringBuffer(clazz.getName());
			buf.append(" implementing ");
			Class[] ifcs = clazz.getInterfaces();
			for (int i = 0; i < ifcs.lengthi++) {
				buf.append(ifcs[i].getName());
				if (i < ifcs.length - 1) {
					buf.append(',');
				}
			}
			return buf.toString();
		}
		else if (clazz.isArray()) {
		}
		else {
			return clazz.getName();
		}
	}


Determine whether the given class has a constructor with the given signature.

Essentially translates NoSuchMethodException to "false".

Parameters:
clazz the clazz to analyze
paramTypes the parameter types of the method
Returns:
whether the class has a corresponding constructor
See also:
java.lang.Class.getMethod(java.lang.String,java.lang.Class[])
	public static boolean hasConstructor(Class clazzClass[] paramTypes) {
		return (getConstructorIfAvailable(clazzparamTypes) != null);
	}

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.

Parameters:
clazz the clazz to analyze
paramTypes the parameter types of the method
Returns:
the constructor, or null if not found
See also:
java.lang.Class.getConstructor(java.lang.Class[])
	public static Constructor getConstructorIfAvailable(Class clazzClass[] paramTypes) {
		Assert.notNull(clazz"Class must not be null");
		try {
			return clazz.getConstructor(paramTypes);
		}
		catch (NoSuchMethodException ex) {
			return null;
		}
	}

Determine whether the given class has a method with the given signature.

Essentially translates NoSuchMethodException to "false".

Parameters:
clazz the clazz to analyze
methodName the name of the method
paramTypes the parameter types of the method
Returns:
whether the class has a corresponding method
See also:
java.lang.Class.getMethod(java.lang.String,java.lang.Class[])
	public static boolean hasMethod(Class clazzString methodNameClass[] paramTypes) {
		return (getMethodIfAvailable(clazzmethodNameparamTypes) != null);
	}

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.

Parameters:
clazz the clazz to analyze
methodName the name of the method
paramTypes the parameter types of the method
Returns:
the method, or null if not found
See also:
java.lang.Class.getMethod(java.lang.String,java.lang.Class[])
	public static Method getMethodIfAvailable(Class clazzString methodNameClass[] paramTypes) {
		Assert.notNull(clazz"Class must not be null");
		Assert.notNull(methodName"Method name must not be null");
		try {
			return clazz.getMethod(methodNameparamTypes);
		}
		catch (NoSuchMethodException ex) {
			return null;
		}
	}

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 check
methodName the name of the method
Returns:
the number of methods with the given name
	public static int getMethodCountForName(Class clazzString methodName) {
		Assert.notNull(clazz"Class must not be null");
		Assert.notNull(methodName"Method name must not be null");
		int count = 0;
		Method[] declaredMethods = clazz.getDeclaredMethods();
		for (int i = 0; i < declaredMethods.lengthi++) {
			Method method = declaredMethods[i];
			if (methodName.equals(method.getName())) {
				count++;
			}
		}
		Class[] ifcs = clazz.getInterfaces();
		for (int i = 0; i < ifcs.lengthi++) {
			count += getMethodCountForName(ifcs[i], methodName);
		}
		if (clazz.getSuperclass() != null) {
			count += getMethodCountForName(clazz.getSuperclass(), methodName);
		}
		return count;
	}

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 check
methodName the name of the method
Returns:
whether there is at least one method with the given name
	public static boolean hasAtLeastOneMethodWithName(Class clazzString methodName) {
		Assert.notNull(clazz"Class must not be null");
		Assert.notNull(methodName"Method name must not be null");
		Method[] declaredMethods = clazz.getDeclaredMethods();
		for (int i = 0; i < declaredMethods.lengthi++) {
			Method method = declaredMethods[i];
			if (method.getName().equals(methodName)) {
				return true;
			}
		}
		Class[] ifcs = clazz.getInterfaces();
		for (int i = 0; i < ifcs.lengthi++) {
			if (hasAtLeastOneMethodWithName(ifcs[i], methodName)) {
				return true;
			}
		}
		return (clazz.getSuperclass() != null && hasAtLeastOneMethodWithName(clazz.getSuperclass(), methodName));
	}

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 interface
targetClass 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
	public static Method getMostSpecificMethod(Method methodClass targetClass) {
		if (method != null && targetClass != null && !targetClass.equals(method.getDeclaringClass())) {
			try {
				method = targetClass.getMethod(method.getName(), method.getParameterTypes());
			}
			catch (NoSuchMethodException ex) {
				// Perhaps the target class doesn't implement this method:
				// that's fine, just use the original method.
			}
		}
		return method;
	}

Return a static method of a class.

Parameters:
methodName the static method name
clazz the class which defines the method
args 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
	public static Method getStaticMethod(Class clazzString methodNameClass[] args) {
		Assert.notNull(clazz"Class must not be null");
		Assert.notNull(methodName"Method name must not be null");
		try {
			Method method = clazz.getDeclaredMethod(methodNameargs);
			if ((method.getModifiers() & .) != 0) {
				return method;
			}
		}
		catch (NoSuchMethodException ex) {
		}
		return 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
	public static boolean isPrimitiveWrapper(Class clazz) {
		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
	public static boolean isPrimitiveOrWrapper(Class clazz) {
		Assert.notNull(clazz"Class must not be null");
		return (clazz.isPrimitive() || isPrimitiveWrapper(clazz));
	}

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
	public static boolean isPrimitiveArray(Class clazz) {
		Assert.notNull(clazz"Class must not be null");
		return (clazz.isArray() && clazz.getComponentType().isPrimitive());
	}

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
	public static boolean isPrimitiveWrapperArray(Class clazz) {
		Assert.notNull(clazz"Class must not be null");
		return (clazz.isArray() && isPrimitiveWrapper(clazz.getComponentType()));
	}

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.

Parameters:
lhsType the target type
rhsType the value type that should be assigned to the target type
Returns:
if the target type is assignable from the value type
See also:
TypeUtils.isAssignable(java.lang.reflect.Type,java.lang.reflect.Type)
	public static boolean isAssignable(Class lhsTypeClass rhsType) {
		Assert.notNull(lhsType"Left-hand side type must not be null");
		Assert.notNull(rhsType"Right-hand side type must not be null");
		return (lhsType.isAssignableFrom(rhsType) ||
	}

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 type
value the value that should be assigned to the type
Returns:
if the type is assignable from the value
	public static boolean isAssignableValue(Class typeObject value) {
		Assert.notNull(type"Type must not be null");
		return (value != null ? isAssignable(typevalue.getClass()) : !type.isPrimitive());
	}


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
	public static String convertResourcePathToClassName(String resourcePath) {
		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
	public static String convertClassNameToResourcePath(String className) {
		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.

Parameters:
clazz the Class whose package will be used as the base
resourceName the resource name to append. A leading slash is optional.
Returns:
the built-up resource path
See also:
java.lang.ClassLoader.getResource(java.lang.String)
java.lang.Class.getResource(java.lang.String)
	public static String addResourcePathToPackagePath(Class clazzString resourceName) {
		Assert.notNull(resourceName"Resource name must not be null");
		if (!resourceName.startsWith("/")) {
			return classPackageAsResourcePath(clazz) + "/" + resourceName;
		}
		return classPackageAsResourcePath(clazz) + resourceName;
	}

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.

Parameters:
clazz the input class. A null value or the default (empty) package will result in an empty string ("") being returned.
Returns:
a path which represents the package name
See also:
java.lang.ClassLoader.getResource(java.lang.String)
java.lang.Class.getResource(java.lang.String)
	public static String classPackageAsResourcePath(Class clazz) {
		if (clazz == null) {
			return "";
		}
		String className = clazz.getName();
		int packageEndIndex = className.lastIndexOf('.');
		if (packageEndIndex == -1) {
			return "";
		}
		String packageName = className.substring(0, packageEndIndex);
		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.

Parameters:
classes a Collection of Class objects (may be null)
Returns:
a String of form "[com.foo.Bar, com.foo.Baz]"
See also:
java.util.AbstractCollection.toString()
	public static String classNamesToString(Class[] classes) {
		return classNamesToString(Arrays.asList(classes));
	}

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.

Parameters:
classes a Collection of Class objects (may be null)
Returns:
a String of form "[com.foo.Bar, com.foo.Baz]"
See also:
java.util.AbstractCollection.toString()
	public static String classNamesToString(Collection classes) {
		if (CollectionUtils.isEmpty(classes)) {
			return "[]";
		}
		StringBuffer sb = new StringBuffer("[");
		for (Iterator it = classes.iterator(); it.hasNext(); ) {
			Class clazz = (Classit.next();
			sb.append(clazz.getName());
			if (it.hasNext()) {
				sb.append(", ");
			}
		}
		sb.append("]");
		return sb.toString();
	}


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
	public static Class[] getAllInterfaces(Object instance) {
		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
	public static Class[] getAllInterfacesForClass(Class clazz) {
		return getAllInterfacesForClass(clazznull);
	}

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
classLoader 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
	public static Class[] getAllInterfacesForClass(Class clazzClassLoader classLoader) {
		Assert.notNull(clazz"Class must not be null");
		if (clazz.isInterface()) {
			return new Class[] {clazz};
		}
		List interfaces = new ArrayList();
		while (clazz != null) {
			for (int i = 0; i < clazz.getInterfaces().lengthi++) {
				Class ifc = clazz.getInterfaces()[i];
				if (!interfaces.contains(ifc) &&
						(classLoader == null || isVisible(ifcclassLoader))) {
					interfaces.add(ifc);
				}
			}
			clazz = clazz.getSuperclass();
		}
		return (Class[]) interfaces.toArray(new Class[interfaces.size()]);
	}

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
	public static Set getAllInterfacesAsSet(Object instance) {
		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
	public static Set getAllInterfacesForClassAsSet(Class clazz) {
		return getAllInterfacesForClassAsSet(clazznull);
	}

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
classLoader 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
	public static Set getAllInterfacesForClassAsSet(Class clazzClassLoader classLoader) {
		Assert.notNull(clazz"Class must not be null");
		if (clazz.isInterface()) {
			return Collections.singleton(clazz);
		}
		Set interfaces = new LinkedHashSet();
		while (clazz != null) {
			for (int i = 0; i < clazz.getInterfaces().lengthi++) {
				Class ifc = clazz.getInterfaces()[i];
				if (classLoader == null || isVisible(ifcclassLoader)) {
					interfaces.add(ifc);
				}
			}
			clazz = clazz.getSuperclass();
		}
		return interfaces;
	}

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.

Parameters:
interfaces the interfaces to merge
classLoader the ClassLoader to create the composite Class in
Returns:
the merged interface as Class
See also:
java.lang.reflect.Proxy.getProxyClass(java.lang.ClassLoader,java.lang.Class[])
	public static Class createCompositeInterface(Class[] interfacesClassLoader classLoader) {
		Assert.notEmpty(interfaces"Interfaces must not be empty");
		Assert.notNull(classLoader"ClassLoader must not be null");
		return Proxy.getProxyClass(classLoaderinterfaces);
	}

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)
	public static boolean isVisible(Class clazzClassLoader classLoader) {
		if (classLoader == null) {
			return true;
		}
		try {
			Class actualClass = classLoader.loadClass(clazz.getName());
			return (clazz == actualClass);
			// Else: different interface class found...
		}
		catch (ClassNotFoundException ex) {
			// No interface class found...
			return false;
		}
	}
New to GrepCode? Check out our FAQ X