package silentium.commons.utils;
import com.google.common.base.Preconditions;
/**
* This class contains utilities that are used when we are working with classes
*
* @author SoulKeeper
*/
public class ClassUtils {
/**
* Return true if class a is either equivalent to class b, or if class a is a subclass of class b, i.e. if a either
* "extends" or "implements" b. Note tht either or both "Class" objects may represent interfaces.
*
* @param a class
* @param b class
* @return true if a == b or a extends b or a implements b
*/
public static boolean isSubclass(final Class<?> a, final Class<?> b) {
// We rely on the fact that for any given java class or
// primtitive type there is a unqiue Class object, so
// we can use object equivalence in the comparisons.
if (a == b)
return true;
Preconditions.checkNotNull(a);
Preconditions.checkNotNull(b);
for (Class<?> x = a; x != null; x = x.getSuperclass()) {
if (x == b)
return true;
if (b.isInterface()) {
final Class<?>[] interfaces = x.getInterfaces();
for (final Class<?> anInterface : interfaces)
if (isSubclass(anInterface, b))
return true;
}
}
return false;
}
}