Java – 取得父類別與介面泛型參數

Java映射的特性可以用來解析類別,亦可用來建立類別實體進行類別欄位以及方法的存取,當類別透過繼承或是實作時使用泛型參數的取得方式,JR在過去專案時有使用到,因此在此紀錄一下。

程式實作

Java程式:BaseInterface.java

package cc.jren.model;

/**
 * BaseInterface
 *
 * @author JR
 * @Date 2022年4月17日
 * @param <T>
 * @param <E>
 * @param <R>
 */
public interface BaseInterface<T, E, R> {

}

Java程式:BaseModel.java

package cc.jren.model;

/**
 * BaseModel
 *
 * @author JR
 * @Date 2022年4月17日
 * @param <T>
 * @param <E>
 * @param <R>
 */
public class BaseModel<T, E, R> {

}

Java程式:Article.java

package cc.jren.model;

/**
 * Article
 *
 * @author JR
 * @Date 2022年4月17日
 */
public class Article extends BaseModel<String, Integer, Boolean> implements BaseInterface<String, Integer, Boolean> {

}

Java程式:GetReflectionGenericsType.java

package cc.jren;

import java.lang.reflect.ParameterizedType;
import java.util.Arrays;
import java.util.logging.Logger;

import cc.jren.model.Article;

/**
 * Java - 取得父類別與介面泛型參數
 *
 * @author JR
 * @Date 2022年4月16日
 */
public class GetReflectionGenericsType {

	private static final Logger LOGGER = Logger.getGlobal();

	public static void main(String[] args) {
		LOGGER.info("取得繼承父類別泛型參數");
		GetSuperClassGenericsType();

		LOGGER.info("取得實作介面泛型參數");
		GetInterfaceGenericsType();
	}
	
	private static void GetSuperClassGenericsType() {
		Arrays.asList((ParameterizedType) Article.class.getGenericSuperclass()).stream()
		.flatMap(item -> Arrays.asList(item.getActualTypeArguments()).stream()).map(item -> {
			try {
				return Class.forName(item.getTypeName());
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
			return null;
		}).forEach(item -> System.out.println(item.getName()));
	}
	
	private static void GetInterfaceGenericsType() {
		Arrays.asList(Article.class.getGenericInterfaces()).stream().filter(item -> item instanceof ParameterizedType)
		.flatMap(item -> Arrays.asList(((ParameterizedType) item).getActualTypeArguments()).stream())
		.map(item -> {
			try {
				return Class.forName(item.getTypeName());
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
			return null;
		}).forEach(item -> System.out.println(item.getName()));
	}

}

執行結果

4月 17, 2022 12:46:50 上午 cc.jren.GetReflectionGenericsType main
資訊: 取得繼承父類別泛型參數
java.lang.String
java.lang.Integer
java.lang.Boolean
4月 17, 2022 12:46:50 上午 cc.jren.GetReflectionGenericsType main
資訊: 取得實作介面泛型參數
java.lang.String
java.lang.Integer
java.lang.Boolean
Tags:

Add a Comment

發佈留言必須填寫的電子郵件地址不會公開。