Я играю с API отражения Java и пишу методы, которые проверяют данный объект и описывают его поля, методы и т. Д.
Я использую метод getFields ()
для перебора различных атрибутов и отображения содержимого объекта:
public static void display(Integer i)
{
System.out.println("An integer: " + i);
}
// Basically a method for each primitive type wrapper
public static void display(Object o)
{
for (Field f : c.getFields())
{
System.out.println("A " + o.getClass() + " which is composed of:");
display(f.get(o));
}
}
(Другие примитивные типы и массивы опущены для простоты.)
Eventhough Метод поля
get
возвращает значение Объект
, я думал, что правильные методы будут вызываться для оболочек примитивных типов (целые числа, строки и т. Д.), Но на самом деле вызывается только display (Object o)
(неявно выполняется понижающее преобразование).
На данный момент я нашел единственное решение, которое я нашел, - это жестко приглушить объекты, если это возможно, например:
public static void display(Object o)
{
if (o instanceof Integer)
{
display((Integer) o);
return;
}
else if (o instanceof String
{
...
} // And so on
for (Field f : c.getFields())
{
System.out.println("A " + o.getClass() + " which is composed of:");
display(f.get(o));
}
}
Это, однако, кажется уродливым, и мне было интересно, есть ли более элегантный способ сделать убедитесь, что вызывается правильный метод. Есть идеи?
Заранее спасибо, добрые люди из StackOverflow!