Java – 取得父類別與介面泛型參數
16 4 月, 2022
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