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
是数组的组件类型

摘自该书,由出版