Java获取泛型的Class对象



tomcat中exec引起的权限问题


在做解析excel的时候,想通过泛型把解析和转java bean的过程封装起来,后面发现java里面只能获取到父类的泛型Class。这样的话,就意味着如果获取泛型Class来实例化bean对象,那么每出现一种excel模板就需要定义一个空实现,把具体的bean Class通过泛型传过去。最后决定增加一个Class<?>参数来传递bean Class。这里记录一下Java获取泛型的Class对象的demo和注意事项。

一、获取泛型Class的方法

Class类的方法:
public Type getGenericSuperclass()
方法作用:
如果超类是参数化类型,则返回的 Type 对象必须准确反映源代码中所使用的实际类型参数。如果以前未曾创建表示超类的参数化类型,则创建这个类型。有关参数化类型创建过程的语义,请参阅ParameterizedType 声明。如果此Class 表示Object 类、接口、基本类型或 void,则返回 null。如果此对象表示一个数组类,则返回表示 Object 类的 Class 对象。

ParameterizedType类的方法:
Type[] getActualTypeArguments()
方法作用:
返回表示此类型实际类型参数的 Type 对象的数组。
注意,在某些情况下,返回的数组为空。如果此类型表示嵌套在参数化类型中的非参数化类型,则会发生这种情况。

二、获取泛型Class对象

(解析Excel的类代码较多,这里定义几个简单的类记录)

定义获取泛型Class对象的工具类

GenericSuperclassUtil

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public class GenericSuperclassUtil {

	/*
	 * 获取泛型类Class对象,不是泛型类则返回null
	 */
	public static Class<?> getActualTypeArgument(Class<?> clazz) {
		Class<?> entitiClass = null;
		Type genericSuperclass = clazz.getGenericSuperclass();
		if (genericSuperclass instanceof ParameterizedType) {
			Type[] actualTypeArguments = ((ParameterizedType) genericSuperclass)
					.getActualTypeArguments();
			if (actualTypeArguments != null && actualTypeArguments.length > 0) {
				entitiClass = (Class<?>) actualTypeArguments[0];
			}
		}

		return entitiClass;
	}

}



定义BaseService<E>,用来测试不使用父类时泛型Class的获取

BaseService<E>

public class BaseService<E> {

	public Class<?> getEntityClass() {
		return GenericSuperclassUtil.getActualTypeArgument(this.getClass());
	}

}


测试BaseService.getEntityClass()

	@Test
	public void testBaseService() {
		System.out.println(new BaseService<User>().getEntityClass());// 控制台输出:null
	}




定义UserService,用来测试使用父类时泛型Class的获取

UserService,继承BaseService<E>

public class UserService extends BaseService<User> {
}

class User {
}

测试UserService.getEntityClass()

	@Test
	public void testUserService() {
		System.out.println(new UserService().getEntityClass());// 控制台输出:class User
	}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章