Java как вывести имя класса

Получение имени класса в Java

Изучите различные способы получения имени класса в Java.

Автор: François Dupire
Дата записи

1. Обзор

В этом уроке мы узнаем о четырех способах извлечения имени класса из методов Class API: getSimpleName () , getName () , getTypeName() и getCanonicalName() .

Эти методы могут сбивать с толку из-за их схожих названий и их несколько расплывчатых Javadoc. Они также имеют некоторые нюансы, когда речь заходит о примитивных типах, типах объектов, внутренних или анонимных классах и массивах.

2. Получение Простого Имени

Давайте начнем с метода getSimpleName () .

В Java существует два типа имен: простые и квалифицированные . Простое имя состоит из уникального идентификатора, в то время как полное имя представляет собой последовательность простых имен, разделенных точками.

Как следует из его названия, getSimpleName() возвращает простое имя базового класса, то есть имя, которое было дано в исходном коде .

Давайте представим себе следующий класс:

Его простое имя будет RetrieveClassName :

Мы также можем получить примитивные типы и массивы простых имен. Для примитивных типов, которые будут просто их именами, например int, boolean или float .

А для массивов метод вернет простое имя типа массива, за которым следует пара открывающих и закрывающих скобок для каждого измерения массива ([]) :

Следовательно, для двумерного String массива вызов getSimpleName() в его классе вернет String[][] .

Наконец, есть конкретный случай анонимных классов. Вызов getSimpleName() в анонимном классе вернет пустую строку.

3. Получение Других Имен

Теперь пришло время взглянуть на то, как мы могли бы получить имя класса, имя типа или каноническое имя. В отличие от getSimpleName() , эти имена предназначены для предоставления дополнительной информации о классе.

Метод getCanonicalName() всегда возвращает каноническое имя , определенное в спецификации языка Java .

Что касается других методов, выходные данные могут немного отличаться в зависимости от вариантов использования. Мы увидим, что это означает для различных типов примитивов и объектов.

3.1. Примитивные типы

Давайте начнем с примитивных типов, поскольку они просты. Для примитивных типов все три метода getName (), getTypeName() и getCanonicalName() вернут тот же результат, что и getSimpleName() :

3.2. Типы объектов

Теперь мы посмотрим, как эти методы работают с типами объектов. Их поведение, как правило, одинаковое: все они возвращают каноническое имя класса .

В большинстве случаев это полное имя, которое содержит все простые имена пакетов классов, а также простое имя класса:

3.3. Внутренние классы

То, что мы видели в предыдущем разделе, – это общее поведение этих вызовов методов, но есть несколько исключений.

Внутренние классы-один из них. Методы getName() и getTypeName() ведут себя иначе, чем метод getCanonicalName() для внутренних классов.

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

С другой стороны, методы getName() и getTypeName() возвращают почти то же самое, но используют доллар в качестве разделителя между каноническим именем заключающего класса и простым именем внутреннего класса .

Давайте представим себе внутренний класс InnerClass нашего RetrieveClassName :

Затем каждый вызов обозначает внутренний класс немного по-другому:

3.4. Анонимные классы

Анонимные классы-еще одно исключение.

Как мы уже видели, у них нет простого имени, но у них также нет канонического имени . Поэтому getCanonicalName() ничего не возвращает. В отличие от getSimpleName() , getCanonicalName() вернет null | и не пустую строку при вызове анонимного класса.

Что касается getName() и getTypeName () , они вернут каноническое имя вызывающего класса, за которым последуют доллар и число, представляющее положение анонимного класса среди всех анонимных классов, созданных в вызывающем классе .

Давайте проиллюстрируем это на примере. Мы создадим здесь два анонимных класса и вызовем getName() на первом и getTypeName() на втором, объявив их в com.baeldung.Главная :

Следует отметить, что второй вызов возвращает имя с увеличенным числом в конце, поскольку оно применяется ко второму анонимному классу.

3.5. Массивы

Наконец, давайте посмотрим, как массивы обрабатываются вышеперечисленными тремя методами.

Чтобы указать, что мы имеем дело с массивами, каждый метод обновит свой стандартный результат. Методы getTypeName() и getCanonicalName() добавят пары скобок к своему результату.

Давайте рассмотрим следующий пример, в котором мы вызываем getTypeName() и getCanonicalName() для двумерного внутреннего класса массива:

Обратите внимание, как первый вызов использует доллар вместо точки, чтобы отделить внутреннюю часть класса от остальной части имени.

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

С другой стороны, при вызове массива объектов он добавит открывающую скобку и букву L к своему стандартному результату и завершится точкой с запятой . Давайте попробуем это на массиве RetrieveClassName :

4. Заключение

В этой статье мы рассмотрели четыре метода доступа к имени класса в Java. Эти методы: getSimpleName(), getName(), getTypeName() и getCanonicalName() .

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

Источник

Java — получить текущее имя класса?

Все, что я пытаюсь сделать, это получить текущее имя класса, а java добавляет бесполезный не-смысл $1 в конец моего имени класса. Как я могу избавиться от него и вернуть только фактическое имя класса?

ОТВЕТЫ

Ответ 1

«$ 1» не является «бесполезным без смысла». Если ваш класс анонимен, добавляется номер.

Если вам не нужен сам класс, но его класс объявления, вы можете использовать getEnclosingClass() . Например:

Вы можете переместить это в некоторый статический метод утилиты.

Но обратите внимание, что это не имя текущего класса. Анонимный класс — это другой класс, чем его класс. Случай аналогичен для внутренних классов.

Ответ 2

Это будет работать до тех пор, пока вы не будете использовать его в статическом методе.

Ответ 3

Попробуйте использовать this.getClass().getCanonicalName() или this.getClass().getSimpleName() . Если это анонимный класс, используйте this.getClass.getSuperclass.getName()

Ответ 4

Вы можете использовать this.getClass().getSimpleName() , например:

Ответ 5

этот ответ задерживается, но я думаю, что есть другой способ сделать это в контексте класса анонимного обработчика.

он достигнет того же результата. Кроме того, на самом деле это довольно удобно, поскольку каждый класс определяется во время компиляции, поэтому динамичность не повреждается.

выше, что если класс действительно вложен, т.е. A на самом деле заключен в B , класс B можно легко назвать:

Ответ 6

В вашем примере this , вероятно, относится к экземпляру анонимного класса. Java дает имя этим классам, добавляя $number к имени охватывающего класса.

Ответ 7

Сочетание обоих ответов. Также печатает имя метода:

Ответ 8

Я предполагаю, что это происходит для анонимного класса. Когда вы создаете анонимный класс, вы фактически создаете класс, который расширяет класс, чье имя вы получили.

«Чистый» способ получить нужное имя:

Если ваш класс является анонимным внутренним классом, getSuperClass() должен предоставить вам класс, из которого он был создан. Если вы создали его из интерфейса, чем ваш SOL, потому что лучшее, что вы можете сделать, это getInterfaces() , которое может дать вам несколько интерфейсов.

«Хакерный» способ — просто получить имя с помощью getClassName() и использовать регулярное выражение для удаления $1 .

Ответ 9

Я нашел, что это работает для моего кода, однако мой код выводит класс из массива в цикле for.

Ответ 10

Существует несколько API Reflection, которые возвращают классы, но могут доступен только в том случае, если класс уже получен либо напрямую или косвенно.

Возвращает все общедоступные классы, интерфейсы и перечисления, которые являются членами класса, включая унаследованные.

Источник

Java-получить текущее имя класса?

все, что я пытаюсь сделать, это получить текущее имя класса, а java добавляет бесполезный не-смысл 1$ до конца имени моего класса. Как я могу избавиться от него и вернуть только фактическое имя класса?

10 ответов

» $1 «не является»бесполезным не-смыслом». Если ваш класс является анонимным, добавляется номер.

Если вы не хотите сам класс, но его объявление класса, то вы можете использовать getEnclosingClass() . Например:

вы можете переместить это в некотором статическом методе утилиты.

но обратите внимание, что это не текущее имя класса. Анонимный класс отличается от класса-оболочки. Аналогично обстоит дело и с внутренними классами.

Это будет работать до тех пор, пока вы не используете его в статическом методе.

попробуйте использовать этот this.getClass().getCanonicalName() или this.getClass().getSimpleName() . Если это анонимный класс, используйте this.getClass().getSuperclass().getName()

можно использовать this.getClass().getSimpleName() , например:

этот ответ поздно, но я думаю, что есть другой способ сделать это в контексте анонимного класса обработчика.

он достигнет такого же результата. кроме того, это на самом деле довольно удобно, так как каждый класс определяется во время компиляции, поэтому динамичность не повреждена.

выше этого, если класс действительно вложен, т. е. A на самом деле заключается в теги B , класс B может быть легко известен как:

сочетание обоих ответов. Также печатает имя метода:

в вашем примере this вероятно, относится к анонимному экземпляру класса. Java дает имя этим классам, добавляя $number к имени заключающего класса.

Я предполагаю, что это происходит для анонимного класса. Когда вы создаете анонимный класс, вы фактически создаете класс, который расширяет класс, имя которого вы получили.

«чистильщик» способ получить имя, которое вы хотите:

если ваш класс является анонимным внутренним классом, getSuperClass() должен дать вам класс, из которого он был создан. Если вы создали его из интерфейса, чем вы вроде SOL, потому что лучшее, что вы можете сделать, это getInterfaces() что может дать вам больше, чем один взаимодействие.

«хакерский» способ-просто получить имя с getClassName() и использовать регулярное выражение, чтобы удалить .

Я нашел, что это работает для моего кода, однако мой код получает класс из массива в цикле for.

Источник

Java — получить имя текущего класса?

Все, что я пытаюсь сделать, это получить текущее имя класса, а java добавляет бесполезный бессмысленный $ 1 в конец имени моего класса. Как я могу избавиться от него и вернуть только фактическое имя класса?

«$ 1» не является «бесполезным бессмысленным». Если ваш класс анонимный, добавляется номер.

Если вам нужен не сам класс, а его класс, то вы можете его использовать getEnclosingClass() . Например:

Вы можете переместить это в некоторый статический служебный метод.

Но обратите внимание, что это не текущее имя класса. Анонимный класс — это другой класс, чем класс, в который он включен. Случай аналогичен для внутренних классов.

Это будет работать до тех пор, пока вы не используете его в статическом методе.

Попробуйте использовать это this.getClass().getCanonicalName() или this.getClass().getSimpleName() . Если это анонимный класс, используйте this.getClass().getSuperclass().getName()

Вы можете использовать this.getClass().getSimpleName() , например, так:

Сочетание обоих ответов. Также печатает имя метода:

этот ответ запоздал, но я думаю, что есть другой способ сделать это в контексте класса анонимного обработчика.

он достигнет того же результата. кроме того, это на самом деле довольно удобно, поскольку каждый класс определяется во время компиляции, поэтому динамичность не нарушается.

Кроме того, если класс действительно является вложенным, т. е. A фактически окружен B , класс B может быть легко известен как:

В вашем примере, this вероятно, относится к экземпляру анонимного класса. Java дает имя этим классам, добавляя a $number к имени включающего класса.

Я предполагаю, что это происходит для анонимного класса. Когда вы создаете анонимный класс, вы фактически создаете класс, который расширяет класс, имя которого вы получили.

«Чистый» способ получить желаемое имя:

Если ваш класс является анонимным внутренним классом, getSuperClass() вам следует указать класс, из которого он был создан. Если вы создали его из интерфейса, чем-то вроде SOL, потому что лучшее, что вы можете сделать, это getInterfaces() предоставить вам более одного интерфейса.

«Хакерский» способ — просто получить имя getClassName() и использовать регулярное выражение для удаления $1 .

Источник

Получить имена классов внутри файла JAR

Узнайте, как получить имена классов внутри данного JAR-файла и как загрузить классы из JAR-файла во время выполнения.

Автор: Kai Yuan
Дата записи

1. Обзор

Большинство библиотек Java доступны в виде JAR-файлов . В этом уроке мы рассмотрим, как получить имена классов внутри данного JAR-файла из командной строки и из программы Java.

Затем мы рассмотрим пример Java-программы, загружающей классы из данного JAR-файла во время выполнения.

2. Пример JAR-файла

В этом уроке мы возьмем stripe-0.0.1-SNAPSHOT.jar файл в качестве примера для решения вопроса о том, как получить имена классов в JAR-файле:

3. Использование команды jar

JDK поставляется с командой jar . Мы можем использовать эту команду с опциями t и f для перечисления содержимого файла JAR :

Поскольку нас интересуют только файлы *.class в архиве, мы можем отфильтровать выходные данные с помощью команды grep :

Это дает нам список файлов классов внутри файла JAR.

4. Получение имен классов JAR – файла в Java

Использование команды jar для печати имен классов из файла JAR довольно просто. Однако иногда мы хотим загрузить некоторые классы из JAR-файла в нашу Java-программу. В этом случае вывода командной строки недостаточно.

Для достижения нашей цели нам нужно отсканировать JAR – файл из Java – программы и получить имена классов.

Давайте посмотрим, как извлечь имена классов из нашего примера JAR-файла с помощью Jar-файла и JarEntry классов :

Теперь давайте подробнее рассмотрим код в приведенном выше методе и поймем, как он работает:

  • try (JarFile JarFile(givenFile)) – Здесь мы использовали оператор try-with-resources для получения jarFile из данного Файла объекта
  • if (JarEntry.getName().EndsWith(“.class”)) – Мы берем каждый класс JarEntry и меняем путь файла класса на квалифицированное имя класса, например change “package1/package2/SomeType.class” into “package1.package2.SomeType”

Давайте проверим, может ли этот метод извлечь имена классов из нашего примера JAR-файла с помощью метода модульного тестирования:

5. Получение классов из JAR-файла в Java

Мы видели, как получить имена классов из файла JAR. Иногда мы хотим динамически загружать некоторые классы из JAR-файла во время выполнения.

В этом случае мы можем сначала получить имена классов из данного JAR-файла с помощью нашего метода getClassNamesFromJarFile .

Далее мы можем создать ClassLoader для загрузки необходимых классов по имени:

В приведенном выше методе мы создали объект URLClassLoader для загрузки классов. Реализация довольно проста.

Однако, вероятно, стоит немного объяснить синтаксис URL-адреса JAR. Допустимый URL-адрес JAR содержит три части: “ jar: + [расположение файла JAR] + !/”.

Окончание “ !/ ” указывает на то, что URL-адрес JAR ссылается на весь файл JAR. Давайте посмотрим несколько примеров URL-адресов JAR:

В нашем методе get Classes From Jar File файл JAR находится в локальной файловой системе, поэтому префикс URL-адреса равен ” file: “.

Теперь давайте напишем тестовый метод, чтобы проверить, может ли наш метод получить все ожидаемые объекты Class :

Как только у нас есть необходимые объекты Class , мы можем использовать Java reflection для создания экземпляров классов и вызова методов.

6. Заключение

В этой статье мы изучили два различных подхода к получению имен классов из данного JAR-файла.

Команда jar может печатать имена классов. Это довольно удобно, если нам нужно проверить, содержит ли файл JAR данный класс. Однако, если нам нужно получить имена классов из запущенной Java-программы, Jar File и JarEntry могут помочь нам достичь этого.

Наконец, мы также видели пример Java-программы для загрузки классов из JAR-файла во время выполнения.

Как всегда, полный исходный код статьи доступен на GitHub .

Источник

Читайте также:  Чем отмыть межплиточный шов
Оцените статью