LINUX.ORG.RU

Java имена типов


0

0

Получаю имя типа, java.lang.String но если массив то бывает или

java.lang.String[]

[Ljava.lang.String

Помню дето натыкался на объяснения сего факта но найти в гугле по запросу [L не получится, может кто ткнет носом? Нужно для десериализации массивов.

★★☆

Ответ на: комментарий от dave

Ноно, перефразирую вопрос:

private String getTypeName(Type type) {
    if (type instanceof GenericArrayType) {
      //WARNING workaround для получения вменяемого имени типа
      // берется базовый тип и добавляется перфикс массива и ';'
      // без этого кода лоя массива строк будет возвращаться
      // "java.lang.String[]" когда нужно "[Ljava.lang.String;"
      Type srcType = ((GenericArrayType) type).getGenericComponentType();
      //WARNING рекурсия из-за того что исходный тип может оказаться классом \
      //или чем еще что также придется причесывать, возможно этого делать ненужно
      StringBuilder typeName = new StringBuilder();
      typeName.append("[");
      if (srcType instanceof Class) {//нужно добавить идентификатор типа
        Class c = (Class) srcType;
        if (!c.isPrimitive()) {
          typeName.append("L");//вида [L<имя класса>;
          typeName.append(c.getName());
          typeName.append(";");
        } else {
          typeName.append(m_types.get(c));
        }
      } else {
        typeName.append(getTypeName(srcType));
      }
      return typeName.toString();
    } else if (type instanceof Class) {
      //WARNING workaround для получения вменяемого имени типа
      //позволяет избавится от префикса class перед именем типа
      return ((Class) type).getName();
    }
    return type.toString();
  }


Есть альтернативные пути ?

wfrr ★★☆
() автор топика

Посмотри в сторону JNI в смысле Java Native для реализации native методов. Там подобные конструкции ([Ljava.lang.String ) используются.

ef37 ★★
()
Ответ на: комментарий от ef37

Эти конструкции описаны в спеке к jvm, но дело в том что иногда Type.toString выдает фигню по которой создат ьтип невозможно, выше я привел метод обходящий это но слишком геморно, вот и спрашиваю если другие пути йопт.

wfrr ★★☆
() автор топика
Ответ на: комментарий от wfrr

А твой обходной путь работает? Если да, то зачем что-то менять. К тому же, твоё решение на мой взгляд выглядит симпатично (особенно по сравнению с тем кодом, с которым мне сейчас приходится иметь дело...)

dave ★★★★★
()
Ответ на: комментарий от dave

Работает, только вот к нему седня добавился класс для получения параметризованного типа по имени. Аналог Class.forName который не позволяет добиться указанного.

wfrr ★★☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.