Получите настоящий тип класса

Если я сделаю что-то вроде этого:

String s = "hello";
Class<?> c = s.getClass();

Тогда c фактически является Class, но есть String. Итак, как мне вернуть String Type?

Потому что, если я использую: c.getClass() Я получаю, очевидно, тип Class.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
205
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Итак, Class<?> c будет ссылаться на объект класса String типа. В Class<?> c в основном есть metadata о классе String.

    String s = "hello";
    Class<?> c =  s.getClass();
    String s1 = (String) c.newInstance();

Отредактировано:

Итак, в объекте Class доступно несколько методов для получения информации о классе:

    Class#getName() //the name of the class or interface represented by this object with package name
    Class#getSimpleName() // returns only the name of the Class

Например:

String s = "hello";
Class<?> c =  s.getClass();
System.out.println("Name : "+c.getName());
System.out.println("Simple Name: "+c.getSimpleName());
System.out.println("Canonical Name: "+c.getCanonicalName());
System.out.println("Type Name : "+c.getTypeName());

Вы получите результат:

Name : java.lang.String
Simple Name: String
Canonical Name: java.lang.String
Type Name : java.lang.String

Примечание. Поскольку вы можете видеть то же самое возвращаемое значение, которое вы получаете для разных методов (например, getCanonicalName, getCanonicalName и т. д.), Может быть не всегда одинаково знать разницу, пожалуйста, ссылку, которую я предоставил ниже.

Вдобавок к этому есть несколько методов, доступных для объекта Class, чтобы получить metadata information о class. Пожалуйста, следуйте документы для получения дополнительной информации.

Нет, мне нужна информация о том, что за Type стоит. Я вообще-то не знаю, что это String.

Fabian Zbinden 18.05.2018 21:30
.getName() помог вместо использования .getClass() Спасибо!
Fabian Zbinden 18.05.2018 21:51

Обратите внимание, что Class.newInstance() сегодня устарел. Constructor.newInstance() - рекомендуемый способ.

davidxxx 19.05.2018 11:20

Во-первых: вы можете получить экземпляр класса из объекта, поскольку экземпляр класса связан с классом (тогда как наличие метода getClass() в классе Object), но он не работает другим способом, поскольку класс не связанный с конкретным экземпляром.

Во-вторых: чтобы получить тип, вам все равно, указан ли неограниченный подстановочный знак в объявленном типе Class, поскольку универсальные шаблоны стираются во время выполнения. Важно то, что информация о классе, связанном (здесь String) с объектом Class, известна самому объекту Class. Так, например, вы можете написать одно или второе:

Class<? extends String> c = s.getClass();
Class<?> c = s.getClass();

И в любом случае вы сможете получить тип String при вызове:

String typeName = c.getTypeName(); // --> java.lang.String
String name = c.getName(); // --> java.lang.String

Другие вопросы по теме