Определить имя класса в 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 для доступа к списку классов элемента.
- Используя свойство className :
class="my-class">