Самоанализ класса с метаданными

Используя Метаданные классов

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

Осмотр класса EmployeeData

Класс 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 содержит только прямые суперклассы.

Inspect Properties

Найдите имена свойств заданными классом 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

Метакласс свойство EnumeratedValues

Свойство 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

Похожие темы

Была ли эта тема полезной?