Java反射,获取属性名称和类型

时间:2011-01-13 12:53:24

标签: 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(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**

如何以正确的格式获取属性类型?

2 个答案:

答案 0 :(得分:2)

你做不到。数组'toString()方法使用[X约定。您可以创建自己的实用程序,它将执行您想要的操作。像

public class ArrayUtils {
   public static String toClassName(Class<?> clazz) {
        if (clazz.isArray()) {
           return clazz.getComponentType().getName() + "[]";
        } else {
           return clazz.getName();
        }
   }
}

更新:PéterTörök将此作为答案添加,但随后将其删除。实际上,您可以使用getCanonicalName()而不是getName()。该方法大致与实用方法相关,即它会给你你想要的东西。但是如果你想要更好地控制表示,你仍然可以拥有你的实用程序类(例如,想要在某些时候省略FQN等)。

答案 1 :(得分:0)

  

晦涩的短语[Ljava.lang.String是其中的具体类型   数组,其中[L表示它是引用类型的数组   java.lang.String是数组的组件类型。

摘录自Java Generics and Collections Maurice Naftalin, Philip Wadler,由O'Reilly

出版