Java 获取类的代码名<;阵列>;
我正在使用反射进行一些代码生成,需要获取描述代码中某些数组类型的字符串。默认的API并没有真正让这变得容易Java 获取类的代码名<;阵列>;,java,reflection,code-generation,Java,Reflection,Code Generation,我正在使用反射进行一些代码生成,需要获取描述代码中某些数组类型的字符串。默认的API并没有真正让这变得容易 (新的int[12]).getClass().getName()返回[I (新日期[2][]).getClass().getName()返回[[Ljava.util.Date 结果是可以解析的,但是有没有更简单、更好的方法分别从这两个方面获取int[]和java.util.Date[][]?没有内置的方法返回“nice name”(也称为java源代码中编写的名称) 返回“nice”名
返回(新的int[12]).getClass().getName()
[I
返回(新日期[2][]).getClass().getName()
[[Ljava.util.Date
int[]
和java.util.Date[][]
?没有内置的方法返回“nice name”(也称为java源代码中编写的名称)
返回“nice”名称:它只返回类名而不返回包,并根据需要附加[]
如果需要具有[]
的完全限定名,则需要手动构造:
public static String getName(final Class<?> clazz) {
if (!clazz.isArray()) {
return clazz.getName();
} else {
return getName(clazz.getComponentType()) + "[]";
}
}
公共静态字符串getName(最终类clazz){
如果(!clazz.isArray()){
返回clazz.getName();
}否则{
返回getName(clazz.getComponentType())+“[]”;
}
}
试试看
数组的简单名称是附加了“[]”的组件类型的简单名称
(新整数[12]).getClass().getName()
返回“[Ljava.lang.Integer;”!(新整数[12]).getClass().getName()
返回“[I”。我想你的意思是“获取int[]
”而不是“获取Integer[]
”。要使格式更好,你需要在你想要呈现的时候放置一些规则,比如去掉“java.lang”甚至“java.util.”用于列表和集合。不要忘记java.sql.Date
与java.util.Date
;不一样。@Matt:是的,和Joachim提到的错误一样。@Peter:因为代码是生成的,所以我不关心其中的FQN。OP可能想要返回clazz.getSimpleName()
而不是return clazz.getName()
@Matt:Oops…我没有意识到getSimpleName()
也处理数组!所以我的答案实际上是错误的!因为生成了代码,所以完全限定的名称是可以的。但是有没有办法获得数组深度(例如日期[]
)从类
对象?@Bart:只需调用getComponentType()
,直到isArray()
返回false
并计算需要调用多少次:这是您的数组维度。哦,非常好-我以前从未注意到这一点。