gpt4 book ai didi

java - 如何获取简单的泛型类型名称?

转载 作者:行者123 更新时间:2023-11-30 01:52:44 24 4
gpt4 key购买 nike

我想获取带有类型参数但没有包名称的方法返回类型的字符串表示形式,例如“List”。

从返回类型的类对象中,我们可以通过 method.getReturnType().getSimpleName() 得到不带包前缀的简单名称。但没有泛型类型参数。输出:List

还可以通过 method.getGenericReturnType().toString() 获取长格式的泛型类型参数。输出:java.util.collections.List<java.util.String>

但是如何获得带有泛型类型参数的简单名称?

例如:List<String>而不是java.util.collections.List<java.util.String>

最佳答案

您需要编写简单的类,它递归地遍历类型并在每个级别生成简单的名称:

class TypeSimpleName {

private final Type value;

public TypeSimpleName(Type value) {
this.value = value;
}

public String getName() {
return getName(value);
}

private String getName(Type type) {
if (type instanceof ParameterizedType) {
return getParameterizedTypeName((ParameterizedType) type);
}
if (type instanceof Class) {
return getClassSimpleName(type);
}
// handle other types if needed

return type.getTypeName();
}

private String getParameterizedTypeName(ParameterizedType type) {
StringBuilder builder = new StringBuilder();

builder.append(getName(type.getRawType()));
Type[] typeArguments = type.getActualTypeArguments();
if (typeArguments.length > 0) {
builder.append("<");
for (int i = 0; i < typeArguments.length; i++) {
Type arg = typeArguments[i];
builder.append(getName(arg));
if (i < typeArguments.length - 1) {
builder.append(", ");
}
}
builder.append(">");
}

return builder.toString();
}

private String getClassSimpleName(Type type) {
return ((Class) type).getSimpleName();
}

@Override
public String toString() {
return getName();
}
}

如何使用:

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.springframework.util.ReflectionUtils;

public class Test {

public static void main(String[] args) {
System.out.println(getReturnTypeName("getList"));
System.out.println(getReturnTypeName("getListList"));
System.out.println(getReturnTypeName("getObj"));
System.out.println(getReturnTypeName("getMapMap"));
}

private static String getReturnTypeName(String method) {
Type returnType = ReflectionUtils.findMethod(Test.class, method).getGenericReturnType();

return new TypeSimpleName(returnType).getName();
}

public List<String> getList() {
return null;
}

public List<List<String>> getListList() {
return null;
}

public Integer getObj() {
return 1;
}

public Map<String, Map<Integer, BigDecimal>> getMapMap() {
return null;
}
}

上面的代码打印:

List<String>
List<List<String>>
Integer
Map<String, Map<Integer, BigDecimal>>

关于java - 如何获取简单的泛型类型名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55511932/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com