2011-01-13 2 views
0

Я сталкиваюсь с проблемой при возврате типов полей в классе.Java Reflection, Получение атрибутов Имена и типы

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

Вы не можете. Метод массивов toString() использует соглашение [X. Вы можете создать свою собственную утилиту, которая будет делать то, что вы хотите. Как

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

Update: Петера Török добавил это как ответ, но потом удалил его. Фактически вы можете использовать getCanonicalName(), а не getName(). Этот метод делает примерно то, что делает метод utility, т. Е. Он даст вам то, что вы хотите. Но вы все равно можете иметь свой класс утилит, если хотите более тонкий контроль над представлением (например, хотите опустить FQN в какой-то момент и т. Д.).

+0

я это начать работать благодаря много –

0

неясный фраза [Ljava.lang.String является овеществленным типом массива, где [L указует на то, что он является массивом ссылочного типа и java.lang.String является типом компонента массива.

Отрывок из книги Java Generics and Collections по Maurice Naftalin, Philip Wadler, опубликованные O'Reilly

Смежные вопросы