Используйте метаданные класса, чтобы получить информацию о классах и объектах программно. Например, можно определить значения атрибута для членов класса или получить список событий, заданных классом. Для основной информации о метаданных см. Метаданные классов.
Класс 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')).Nameans = 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