Как узнать имя класса
Перейти к содержимому

Как узнать имя класса

  • автор:

Определить имя класса в Java

В этом посте будет обсуждаться, как определить имя класса базового класса объектов в Java.

1. Класс get*Name() методы

Самый простой способ — вызвать getClass() метод, возвращающий имя класса или интерфейс, представленный объектом, не являющимся массивом. Мы также можем использовать getSimpleName() или же getCanonicalName() , который возвращает простое имя (как в исходном коде) и каноническое имя базового класса соответственно. getTypeName() является недавним дополнением к JDK в Java SE 8, которое внутренне вызывает getClass() .

Узнать имя класса во время исполнения программы

У меня есть функция (используется для записи логов), которая вызывается в разных классах. Не хочется каждый раз переписывать код в ней для каждого нового класса(они будут и добавляться и убираться со временем, ну или вообще функция будет использоваться в дальнейшем в других проектах). Мне хотелось бы узнавать имя класса, из которого она вызывается (для задания имени файлу и прочих плюшек) не передавая лишних параметров в функцию. Это можно реализовать? Можно и boost`ом.

Отслеживать
задан 22 апр 2016 в 10:51
761 1 1 золотой знак 7 7 серебряных знаков 19 19 бронзовых знаков
это похоже на то, что Вы хотите stackoverflow.com/questions/1666802/is-there-a-class-macro-in-c
22 апр 2016 в 11:12
Если вам дан исчерпывающий ответ, отметьте его как верный (галка напротив выбранного ответа).
23 апр 2016 в 13:16

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Функция typeid(object) возвращает объект типа type_info с информацией о типе объекта, для которого она вызывается (собственно, о классе). У этого объекта( type_info ) есть метод name() , который и возвращает имя класса. Для использования нужно подключить .

Так что в итоге для получения имени класса нужно использовать

Или, если функция не является методом класса, передать в typeid сам объект или разыменованный указатель.

Отслеживать
ответ дан 22 апр 2016 в 13:53
36 1 1 бронзовый знак

Никто не гарантирует, что name() вернёт «человеческое» имя. Как показывает практика, в некоторых компиляторах, эти имена ничего не могут сказать человеку.

23 апр 2016 в 9:26

Собственные средства c++ не позволяют ничего узнать о контектсте вызова функции.

Стек вызова можно проанализировать с помощью некоторых внешних библиотек / API операционной системы. Например: http://man7.org/linux/man-pages/man3/backtrace.3.html https://msdn.microsoft.com/en-us/library/ms680650%28VS.85%29.aspx . Но для применение этих средств может налагать дополнительные ограничения на собираемый код (сборка с отладочной информацией и т.д.).

Более разумно, ИМХО, передавать контекст вызова явно: это позволит использовать «штатные» средства c++: __FILE__ , __LINE__ , __func__ , . Извлечение контекста можно замаскировать макросом:

 struct Context< const char* file; unsigned line; const char* function; >; // Work around MSVS #ifndef __func__ #define __func__ __FUNCTION__ #endif #define CONTEXT() Context(< __FILE__, __LINE__, __func__>) void foo( int a, int b, Context c ); #define FOO(a, b) foo( a, b, CONTEXT() ) 

Имя класса можно извлечь либо разобрав имя __FUNCTION__ , либо из указателя this :

 typeid(this).name() 

Но не хочется включать этот обращение к this в макрос, поскольку функции может быть вызвана из контекста, статической функции.

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

Получить имя класса через параметр экземпляра этого класса

Добрый день! Подскажите пожалуйста можно ли получить имя класса при обращении к параметру экземпляра этого класса?

Кликните здесь для просмотра всего текста

1 2 3 4 5 6 7 8 9 10 11 12 13 14
class MyClass: def __init__(self, object): self.data = object obj = [ { 'name': 'ivanov', 'last_name': 'ivan', 'age': 25 } ] instance = MyClass(obj) print(type(instance)) # print(type(instance.data)) #

Для чего все это нужно. У меня есть класс Database с методом create, который создает таблицу в БД SQLite с именем класса на основе values (список словарей), а также определяет типы данных полей таблицы. Однако имя класса берется не из экземпляра класса, а из параметра values (список).

Кликните здесь для просмотра всего текста

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
import sqlite3 class Database: def __init__(self): self.__conn = sqlite3.connect('sqlite_python.db', check_same_thread=False) def __del__(self): self.__conn.close() def create(self, values: list, table=None) -> None: '''Method for creating a new table. The method automatically detects data types for columns.''' types = { "": "INTEGER", "": "REAL", "": "TEXT", "": "BLOB" } query = f'''CREATE TABLE IF NOT EXISTS ( id INTEGER PRIMARY KEY AUTOINCREMENT, <','.join([key + ' ' + types[str(type(value))] for key, value in values[0].items()])>, datetime DATE NOT NULL DEFAULT (datetime('now','localtime')), UNIQUE(<','.join([key for key in values[0].keys()])>) ON CONFLICT IGNORE );''' cur = self.__conn.cursor() cur.execute(query) cur.close()

js получить название класса

Чтобы получить название класса в JavaScript, нужно использовать свойство className элемента или метод classList для доступа к списку классов элемента.

  1. Используя свойство className :
 class="my-class">
const element = document.querySelector('.my-class'); const className = element.className; console.log(className); // выведет "my-class" 
  1. Используя метод classList :
 class="my-class">
const element = document.querySelector('.my-class'); const classList = element.classList; console.log(classList); // выведет объект DOMTokenList console.log(classList[0]); // выведет первый класс элемента, т.е. "my-class" 

Важно учитывать, что если элемент имеет несколько классов, то возвращаемое свойством className значение будет строкой, содержащей все классы через пробел. Если же нужно работать с каждым классом отдельно, то лучше использовать метод classList , который возвращает объект DOMTokenList , содержащий все классы элемента в виде отдельных строк.

  1. Получение списка всех классов элемента:
 class="foo bar">
const element = document.querySelector('div'); const classList = element.classList; console.log(classList); // выведет DOMTokenList ["foo", "bar"] 
  1. Получение первого класса элемента:
 class="foo bar">
const element = document.querySelector('div'); const firstClass = element.classList[0]; console.log(firstClass); // выведет "foo" 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *