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