Java反射,获取属性名称和类型
我在课堂上检索字段类型时遇到了一个问题Java反射,获取属性名称和类型,java,Java,我在课堂上检索字段类型时遇到了一个问题 class Test { public int x; public int[] y; public String[] names; } public class Main { static void main(String[] args) { try { printAttributes(Class.forName("Test")); } catch(E
class Test {
public int x;
public int[] y;
public String[] names;
}
public class Main {
static void main(String[] args) {
try {
printAttributes(Class.forName("Test"));
}
catch(Exception ex){}
}
static void printAttributes(Class clazz) {
Field[] fields=clazz.getFields();
for (int i = 0; i < fields.length; i++) {
System.out.println(fields[i].getType().getName().toString()+" "+ fields[i].getName().toString());
}
}
}
输出
int x //its OK
[I y //I need **int[] y**
[Ljava.lang.String; names //I need **java.lang.String[] names**
如何以正确的格式获取属性类型?您不能。Arrays'
toString()
方法使用[X
约定。您可以创建自己的实用程序来执行您想要的操作。如
public class ArrayUtils {
public static String toClassName(Class<?> clazz) {
if (clazz.isArray()) {
return clazz.getComponentType().getName() + "[]";
} else {
return clazz.getName();
}
}
}
公共类数组直到{
公共静态字符串toClassName(类clazz){
if(clazz.isArray()){
返回clazz.getComponentType().getName()+“[]”;
}否则{
返回clazz.getName();
}
}
}
更新:péter Török将此作为答案添加,然后将其删除。事实上,您可以使用getCanonicalName()
而不是getName()
。该方法的作用与about实用程序方法大致相同,即它将为您提供所需的内容。但是,如果您希望对表示进行更精细的控制(例如,希望在某个点忽略FQN,等等),您仍然可以使用实用程序类
晦涩的短语[Ljava.lang.String
是
数组,其中[L
表示它是引用类型的数组,并且
java.lang.String
是数组的组件类型
摘自该书,由出版