反射获取泛型信息
程序员文章站
2024-03-14 18:37:05
...
反射获取泛型信息
package com.example.demo;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;
/**
* Created with IntelliJ IDEA.
*
* @Description:
* @create: 2020-12-08 22:38
**/
public class Generic {
public void test01(Map<Integer, String> integerStringMap, List<Long> longList) {
System.out.println("test01");
}
public Map<Integer, String> test02(){
System.out.println("test02");
return null;
}
public Long test03(){
System.out.println("test03");
return 0L;
}
public int test04(){
System.out.println("test04");
return 1;
}
/**
* 功能描述: 〈获取泛型参数类型〉
*
* @param
* @return: void
* @author: wangbo
* @date : 2020-12-08 22:54:47
* @version:
*/
public static void getGenericParamInfo() throws NoSuchMethodException {
Method method = Generic.class.getMethod("test01", Map.class, List.class);
// 关闭安全检查
method.setAccessible(true);
// 获取泛型参数类型`
Type[] genericParameterTypes = method.getGenericParameterTypes();
for (Type genericParameterType : genericParameterTypes) {
System.out.println(method.getName()+ "#" + genericParameterType);
System.out.println(method.getName()+ "#" + genericParameterType.getTypeName());
// 泛型参数类型 是不是 参数化类型
if (genericParameterType instanceof ParameterizedType) {
//获取实际类型参数
Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();
for (Type actualTypeArgument : actualTypeArguments) {
System.out.println(actualTypeArgument);
}
}
}
}
/**
* 功能描述: 〈获取泛型返回类型信息〉
*
* @param
* @return: void
* @author: wangbo
* @date : 2020-12-08 22:54:29
* @version:
*/
public static void getGenericReturnInfo() throws NoSuchMethodException {
Method method = Generic.class.getMethod("test02", null);
// 关闭安全检查
method.setAccessible(true);
// 获取泛型参数类型
Type genericReturnType = method.getGenericReturnType();
System.out.println(method.getName()+ "#" + genericReturnType);
System.out.println(method.getName()+ "#" + genericReturnType.getTypeName());
// 泛型参数类型 是不是 参数化类型
if (genericReturnType instanceof ParameterizedType) {
//获取实际类型参数
Type[] actualTypeArguments = ((ParameterizedType) genericReturnType).getActualTypeArguments();
for (Type actualTypeArgument : actualTypeArguments) {
System.out.println(actualTypeArgument);
}
}
}
/**
* 功能描述: 〈获取返回类型信息〉
*
* @param
* @return: void
* @author: wangbo
* @date : 2020-12-08 22:54:29
* @version:
*/
public static void getGenericReturnInfo2() throws NoSuchMethodException {
Method method = Generic.class.getMethod("test03", null);
// 关闭安全检查
method.setAccessible(true);
// 获取泛型参数类型
Type genericReturnType = method.getGenericReturnType();
System.out.println(method.getName()+ "#" + genericReturnType);
System.out.println(method.getName()+ "#" + genericReturnType.getTypeName());
// 泛型参数类型 是不是 参数化类型
if (genericReturnType instanceof ParameterizedType) {
//获取实际类型参数
Type[] actualTypeArguments = ((ParameterizedType) genericReturnType).getActualTypeArguments();
for (Type actualTypeArgument : actualTypeArguments) {
System.out.println(actualTypeArgument);
}
} else {
if (Long.class.getTypeName().equals(genericReturnType.getTypeName())) {
System.out.println("---------Long类型");
}
}
}
/**
* 功能描述: 〈获取返回类型信息〉
*
* @param
* @return: void
* @author: wangbo
* @date : 2020-12-08 22:54:29
* @version:
*/
public static void getGenericReturnInfo3() throws NoSuchMethodException {
Method method = Generic.class.getMethod("test04", null);
// 关闭安全检查
method.setAccessible(true);
// 获取泛型参数类型
Type genericReturnType = method.getGenericReturnType();
System.out.println(method.getName()+ "#" + genericReturnType);
System.out.println(method.getName()+ "#" + genericReturnType.getTypeName());
// 泛型参数类型 是不是 参数化类型
if (genericReturnType instanceof ParameterizedType) {
//获取实际类型参数
Type[] actualTypeArguments = ((ParameterizedType) genericReturnType).getActualTypeArguments();
for (Type actualTypeArgument : actualTypeArguments) {
System.out.println(actualTypeArgument);
}
} else {
if (Long.class.getTypeName().equals(genericReturnType.getTypeName())) {
System.out.println("---------Long类型");
} else if (int.class.getTypeName().equals(genericReturnType.getTypeName())) {
System.out.println("---------int类型");
}
}
}
public static void main(String[] args) throws NoSuchMethodException {
getGenericParamInfo();
System.out.println("=================================");
getGenericReturnInfo();
System.out.println("=================================");
getGenericReturnInfo2();
System.out.println("=================================");
getGenericReturnInfo3();
}
}
返回信息
test01#java.util.Map<java.lang.Integer, java.lang.String>
test01#java.util.Map<java.lang.Integer, java.lang.String>
class java.lang.Integer
class java.lang.String
test01#java.util.List<java.lang.Long>
test01#java.util.List<java.lang.Long>
class java.lang.Long
=================================
test02#java.util.Map<java.lang.Integer, java.lang.String>
test02#java.util.Map<java.lang.Integer, java.lang.String>
class java.lang.Integer
class java.lang.String
=================================
test03#class java.lang.Long
test03#java.lang.Long
---------Long类型
=================================
test04#int
test04#int
---------int类型