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
	}



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