All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.weicoder.common.util.ClassUtil Maven / Gradle / Ivy

package com.weicoder.common.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;

import com.weicoder.common.constants.StringConstants;
import com.weicoder.common.lang.Lists;

/**
 * 关于Class的一些操作
 * @author WD
 * @since JDK7
 * @version 1.0 2010-01-20
 */
public final class ClassUtil {
	/**
	 * 获得指定类型的泛型
	 * @param type 指定的类型
	 * @return 这个类的泛型
	 */
	public static  Class getGenericClass(Class clazz) {
		// 查询父类是否有泛型
		Class gc = getGenericClass(clazz.getGenericSuperclass(), 0);
		// 如果没找到
		if (gc == null) {
			// 获得所有接口
			Type[] type = clazz.getGenericInterfaces();
			// 接口不为空
			if (!EmptyUtil.isEmpty(type)) {
				// 循环接口
				for (Type t : type) {
					// 获得泛型
					gc = getGenericClass(t, 0);
					// 泛型不为空 跳出循环
					if (gc != null) {
						break;
					}
				}
			}
		}
		// 返回类
		return gc;
	}

	/**
	 * 获得指定类型的泛型
	 * @param type 指定的类型
	 * @return 这个类的泛型
	 */
	public static Class[] getGenericClass(Type type) {
		// 获得类型类型数组
		Type[] types = ((ParameterizedType) type).getActualTypeArguments();
		// 声明Class数组
		Class[] clazzs = new Class[types.length];
		// 循环
		for (int i = 0; i < types.length; i++) {
			// 强制转换
			clazzs[i] = (Class) types[i];
		}
		// 返回数组
		return clazzs;
	}

	/**
	 * 获得指定类型的泛型
	 * @param type 指定的类型
	 * @param index 索引
	 * @return 这个类型的泛型
	 */
	@SuppressWarnings("unchecked")
	public static  Class getGenericClass(Type type, int index) {
		try {
			return (Class) ((ParameterizedType) type).getActualTypeArguments()[index];
		} catch (Exception e) {
			return null;
		}
	}

	/**
	 * 加载类
	 * @param className 类名
	 * @return 获得的类
	 */
	public static Class loadClass(String className) {
		// 声明类
		Class theClass = null;
		try {
			// 获得类
			theClass = Class.forName(className);
		} catch (ClassNotFoundException e1) {
			try {
				// 当前线程获得类
				theClass = Thread.currentThread().getContextClassLoader().loadClass(className);
			} catch (ClassNotFoundException e2) {
				try {
					// 使用当前类获得类
					theClass = ClassUtil.class.getClassLoader().loadClass(className);
				} catch (ClassNotFoundException e3) {
					return null;
				}
			}
		}
		// 返回类
		return theClass;
	}

	/**
	 * 获得Class
	 * @param className Class名称
	 * @return Class
	 */
	public static Class forName(String className) {
		try {
			return Class.forName(className);
		} catch (Exception e) {
			return null;
		}
	}

	/**
	 * 实例化对象
	 * @param className 类名
	 * @return 实例化对象
	 */
	public static Object newInstance(String className) {
		try {
			return forName(className).newInstance();
		} catch (Exception e) {
			return null;
		}
	}

	/**
	 * 实例化对象
	 * @param clazz 类
	 * @return 实例化对象
	 */
	public static  T newInstance(Class clazz) {
		try {
			return clazz.newInstance();
		} catch (Exception e) {
			return null;
		}
	}

	/**
	 * 指定包下 指定类的实现
	 * @param packageName 包名
	 * @param cls 指定类
	 * @return 类列表
	 */
	public static List> getAssignedClass(String packageName, Class cls) {
		// 声明类列表
		List> classes = Lists.getList();
		// 循环包下所有类
		for (Class c : getPackageClasses(packageName)) {
			// 是本类实现 并且不是本类
			if (cls.isAssignableFrom(c) && !cls.equals(c)) {
				classes.add(c);
			}
		}
		// 返回列表
		return classes;
	}

	/**
	 * 获得指定包下的所有Class
	 * @param packageName 报名
	 * @return 类列表
	 */
	public static List> getPackageClasses(String packageName) {
		// 声明返回类列表
		List> classes = Lists.getList();
		// 转换报名为路径格式
		String path = packageName.replace(StringConstants.POINT, StringConstants.BACKSLASH);
		// 循环目录下的所有文件与目录
		for (String name : getClasses(ResourceUtil.getResource(path).getPath(), path)) {
			// 如果是class文件
			if (name.endsWith(".class")) {
				try {
					// 反射出类对象 并添加到列表中
					classes.add(Class.forName(packageName + StringConstants.POINT + StringUtil.subString(name, 0, name.length() - 6)));
				} catch (ClassNotFoundException e) {}
			} else {
				// 迭代调用本方法 获得类列表
				classes.addAll(getPackageClasses(packageName + StringConstants.POINT + name));
			}
		}
		// 返回类列表
		return classes;
	}

	private static List getClasses(String name, String packageName) {
		// 获得文件名
		File path = new File(name);
		// 判断是否目录
		if (path.isDirectory()) {
			// 如果是目录
			return Lists.getList(path.list());
		} else if (name.indexOf(".jar!") > -1) {
			// 是否jar文件内
			return getClassesFromJARFile(StringUtil.subString(name, "file:/", "!"), packageName + StringConstants.BACKSLASH);
		}
		// 返回空列表
		return Lists.emptyList();
	}

	private static List getClassesFromJARFile(String jar, String name) {
		// 判断jar第二位是否: 不为:默认linux前面加上/
		if (jar.indexOf(StringConstants.COLON) == -1) {
			jar = StringConstants.BACKSLASH + jar;
		}
		// 声明返回列表
		List list = Lists.getList();
		// 获得jar流
		try (JarInputStream jarFile = new JarInputStream(new FileInputStream(jar))) {
			// 循环获得JarEntry
			JarEntry jarEntry = null;
			while ((jarEntry = jarFile.getNextJarEntry()) != null) {
				// 判断是否包内class
				String className = jarEntry.getName();
				if (className.indexOf(name) > -1 && !className.equals(name)) {
					list.add(StringUtil.subString(className, name));
				}
			}
		} catch (IOException e) {}
		// 返回列表
		return list;
	}

	/**
	 * 私有构造
	 */
	private ClassUtil() {}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy