Интроспекция классов с метаданными

Использование метаданных классов

Используйте метаданные классов, чтобы получить информацию о классах и объектах программно. Для примера можно определить значения атрибутов для членов класса или получить список событий, определенных классом. Основные сведения о метаданных см. в разделе «Метаданные классов».

Смотрите класс EmployeeData

The EmployeeData класс является handle класс с двумя свойствами, одно из которых имеет частные Access и определяет метод доступа к набору.

classdef EmployeeData < handle
   properties
      EmployeeName
   end
   properties (Access = private)
      EmployeeNumber
   end
   methods
      function obj = EmployeeData(name,ss)
         if nargin > 0
            obj.EmployeeName = name;
            obj.EmployeeNumber = ss;
         end
      end
      function set.EmployeeName(obj,name)
         if ischar(name)
            obj.EmployeeName = name;
         else
            error('Employee name must be a char vector')
         end
      end
   end
end

Просмотр определения класса

Использование EmployeeData класс, создать meta.class объект с использованием ? оператор:

mc = ?EmployeeData;

Определите, из каких классов EmployeeData выводит. Возвращаемое значение является meta.class объект для handle суперкласс:

a = mc.SuperclassList;
a.Name
ans =

handle

The EmployeeData класс имеет только один суперкласс. Для классов, имеющих более одного прямого суперкласса, a содержит meta.class объект для каждого суперкласса.

Используйте индексированную ссылку для ссылки на любой конкретный суперкласс:

a(1).Name

или, непосредственно от mc:

mc.SuperclassList(1).Name
ans =

handle

The SuperclassList свойство содержит только прямые суперклассы.

Просмотр свойств

Найдите имена свойств, заданных в EmployeeData класс. Сначала получите массив meta.properties объекты из meta.class PropertyList свойство.

mc = ?EmployeeData;
mpArray = mc.PropertyList;

Длина mpArray указывает, что существует два meta.property объекты, по одному для каждого свойства, заданного в EmployeeData класс:

length(mpArray)
ans =
     2

Теперь получите meta.property объект из массива:

prop1 = mpArray(1);
prop1.Name
ans =

EmployeeName 

The Name свойство meta.property объект определяет свойство класса, представленное этим meta.property объект.

Запросить другое meta.property свойства объекта для определения атрибутов EmployeeName свойства.

Поиск компонента с определенным атрибутом

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

mc = ?EmployeeData;
mc.PropertyList(ismember({mc.PropertyList(:).SetAccess},'private')).Name
ans =

EmployeeNumber

Access не является свойством meta.property класс. Использование SetAccess и GetAccess, которые являются свойствами meta.property класс.

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

mc = ?handle;
mc.MethodList(ismember([mc.MethodList(:).Hidden],true)).Name
ans =

empty

Смотрите образец класса

Создайте EmployeeData объект и определить настройки доступа к свойствам:

EdObj = EmployeeData('My Name',1234567);
mcEdObj = metaclass(EdObj);
mpArray = mcEdObj.PropertyList;
EdObj.(mpArray(1).Name) % Dynamic field names work with objects

Значение EmployeeName свойство является текстом My Name, который был назначен в конструкторе.

ans =
   My Name

Значение EmployeeNumber свойство недоступно, поскольку свойство имеет частные Access.

EdObj.(mpArray(2).Name)
You cannot get the 'EmployeeNumber' property of EmployeeData.
mpArray(2).GetAccess
ans =
   private

Получите функцию handle на EmployeeName функция доступа к набору свойств:

mpArray(1).SetMethod
ans = 
   @D:\MyDir\@EmployeeData\EmployeeData.m>EmployeeData.set.EmployeeName

Метакласс EnumeratedValues

The meta.class EnumeratedValues свойство содержит массив meta.EnumeratedValue объекты, по одному для каждого представителя перечисления. Используйте meta.EnumeratedValue Name свойство для получения имен представителей перечисления, заданных классом перечисления. Для примера, учитывая WeekDays класс перечисления:

classdef WeekDays
   enumeration
      Monday, Tuesday, Wednesday, Thursday, Friday
   end
end

Имена перечислений запросов из meta.class объект:

mc = ?WeekDays;
mc.EnumerationMemberList(2).Name
ans =

Tuesday

Похожие темы