package com.app.mvc.util;
import com.google.common.base.Throwables;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.google.common.reflect.ClassPath;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.util.List;
import static com.google.common.reflect.ClassPath.from;
/**
* Created by jimin on 16/5/9.
*/
public class ClassUtil {
/**
* 是否有clazz的超类superClass,该方法会递归的进行,一直到Object父类
*
* @param clazz Class
* @param superClass Class
* @return boolean
*/
public static boolean hasSuperClass(Class<?> clazz, Class<?> superClass) {
/** 递归退出 */
return clazz != null && (clazz.getSuperclass() == superClass || hasSuperClass(clazz.getSuperclass(), superClass));
}
/**
* clazz是否实现了接口iface,该方法会递归的执行。
*
* @param clazz Class
* @param iface Class
* @return boolean
*/
public static boolean hasInterface(Class<?> clazz, Class<?> iface) {
/** 递归退出 */
if (clazz == null)
return false;
Class<?>[] ifaces = clazz.getInterfaces();
for (Class<?> aClass : ifaces) {
if (iface == aClass) {
return true;
}
}
return hasInterface(clazz.getSuperclass(), iface);
}
/**
* clazz上是否有注解标注
*
* @param clazz Class
* @param annotation Class
* @param <e> annotation
* @return boolean
*/
public static <e extends Annotation> boolean hasAnnotation(Class clazz, Class<e> annotation) {
return clazz.getAnnotation(annotation) != null;
}
/**
* 获得系统class loader,等价于:
* ClassLoader.getSystemClassLoader()
*
* @return ClassLoader
*/
public static ClassLoader defaultLoader() {
return ClassLoader.getSystemClassLoader();
}
/**
* 递归的获得package下的所有类信息,不包含内部类
*
* @param packageName String
* @return Collection
*/
public static ImmutableSet<ClassPath.ClassInfo> loadClasses(String packageName) {
try {
return from(defaultLoader()).getTopLevelClassesRecursive(packageName);
} catch (IOException e) {
Throwables.propagate(e);
}
return null;
}
/**
* 创建class的实例,注意,必须具有无参数构造器
*
* @param clazz Class
* @param <t> 类型
* @return t
*/
public static <t> t newInstance(Class<t> clazz) {
try {
return clazz.newInstance();
} catch (Exception ex) {
throw new RuntimeException("检查是否是具有无参构造方法", ex);
}
}
public static List<Class> getSubClassList(Class clazz, String packagePreffix) {
List<Class> list = Lists.newArrayList();
try {
ImmutableSet<ClassPath.ClassInfo> immutableSet = from(clazz.getClassLoader()).getTopLevelClassesRecursive(packagePreffix);
for (ClassPath.ClassInfo classInfo : immutableSet) {
if (classInfo.getName().startsWith(packagePreffix)) {
try {
Class curClazz = classInfo.load();
if (clazz.isAssignableFrom(curClazz) && !clazz.equals(curClazz)) {
list.add(curClazz);
}
} catch (Throwable t) {
continue;
}
}
}
} catch (Throwable t) {
}
return list;
}
}