Я хотел бы написать код вроде этого:
Object o = ...;
String oTypeName = o.getClass().getName();
//on the other side of the wire:
Class<?> oClass = Class.forName(oTypeName);
Object oAgain = oClass.newInstance();
Однако из javadoc неясно, какой метод я должен использовать для инициализации oTypeName
, т.е. какой метод будет генерировать ожидаемый ввод Class.forName()
:
-
getCanonicalName()
:" Возвращает каноническое имя базового класса, как определено спецификацией языка Java. Возвращает null, если базовый класс не имеют канонического имени (т.е. если это локальный или анонимный класс или массив, у которого тип компонента не имеет канонического имени). -
getName()
:" Возвращает имя сущности (класс, интерфейс, класс массива, примитивный тип или void), представленный этим Объект класса в виде строки. Если этот объект класса представляет ссылочный тип, который не является типом массива, тогда возвращается двоичное имя класса, как указано в Спецификации языка Java ™. -
getTypeName()
: "Верните информативную строку для имени этого типа".
Довольно очевидно, что я не хочу ни одного из них:
-
getSimpleName()
: "Возвращает простое имя базового класса, как указано в исходном коде". -
toString()
: "Строковое представление представляет собой строку" класс "или" интерфейс ", за которой следует пробел, а затем полное имя класса в формате, возвращаемом getName"
Я не ожидаю, что это будет работать для примитивных типов. Это нормально, если он не будет работать для массивов. Главное, что меня беспокоит, это вложенные классы и Foo.Bar
vs. Foo$Bar
.