exponenta event banner

Самоанализ класса с помощью метаданных

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

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

Проверка класса EmployureData

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

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

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

a(1).Name

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

mc.SuperclassList(1).Name
ans =

handle

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 

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

Свойство перечисления значений метакласса

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

Связанные темы