作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想获取带有类型参数但没有包名称的方法返回类型的字符串表示形式,例如“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/
我是一名优秀的程序员,十分优秀!