Используйте класс meta.property
, чтобы определить значения атрибутов свойства. Перезаписываемые свойства объекта meta.property
соответствуют атрибутам связанного свойства. Значения перезаписываемых свойств meta.property
соответствуют значениям атрибута, заданным в определении класса.
Получите объект meta.property
для свойства от объекта meta.class
. Получить объект meta.class
для класса:
Используйте функцию metaclass
на объекте класса.
Используйте оператор ?
с именем класса.
Например, класс BasicHandle
задает три свойства:
classdef BasicHandle < handle properties (SetAccess = private) Date = date PassKey = randi(9,[1,7]) end properties Category {mustBeMember(Category,{'new','change'})} = 'new' end end
Создайте объект meta.class
с помощью оператора ?
с именем класса:
mc = ?BasicHandle
mc = class with properties: Name: 'BasicHandle' Description: '' DetailedDescription: '' Hidden: 0 Sealed: 0 Abstract: 0 Enumeration: 0 ConstructOnLoad: 0 HandleCompatible: 1 InferiorClasses: {0×1 cell} ContainingPackage: [0×0 meta.package] RestrictsSubclassing: 0 PropertyList: [3×1 meta.property] MethodList: [22×1 meta.method] EventList: [1×1 meta.event] EnumerationMemberList: [0×1 meta.EnumeratedValue] SuperclassList: [1×1 meta.class]
Свойство объекта meta.class
под названием PropertyList
содержит массив объектов meta.property
, один для каждого свойства, заданного классом. Например, имя свойства, сопоставленного с объектом meta.property
в элементе 1
:
mc.PropertyList(1).Name
ans = Date
Объект meta.class
содержит объект meta.property
для всех свойств, включая скрытые свойства. Функция properties
возвращает только публичные свойства.
Для класса Handle используйте
метод findprop
handle
, чтобы получить объект meta.property
для определенного свойства.
Например, найдите объект meta.property
для свойства Category
класса BasicHandle
.
mp = findprop(BasicHandle,'Category')
mp = property with properties: Name: 'Category' Description: '' DetailedDescription: '' GetAccess: 'public' SetAccess: 'public' Dependent: 0 Constant: 0 Abstract: 0 Transient: 0 Hidden: 0 GetObservable: 0 SetObservable: 0 AbortSet: 0 NonCopyable: 0 GetMethod: [] SetMethod: [] HasDefault: 1 DefaultValue: 'new' DefiningClass: [1×1 meta.class]
Предыдущее отображение meta.property
показывает что свойство Category
объекта BasicHandle
по умолчанию:
Имеет общедоступный GetAccess
и SetAccess
Имеет значение по умолчанию new
Для списка атрибутов свойства см. Таблицу Атрибутов свойств.
Доступ к другому метаклассу возражает непосредственно от свойств объектов meta.class
. Например, оператор:
mc = ?containers.Map;
возвращает объект meta.class
:
class(mc)
ans = meta.class
Ссылка на свойство PropertyList
meta.class
возвращает массив с одним объектом meta.property
для каждого свойства класса containers.Map
:
class(mc.PropertyList)
ans = meta.property
Каждый элемент массива является одним объектом meta.property
:
mc.Properties(1)
ans = [1x1 meta.property]
Свойство Name
объекта meta.property
содержит вектор char
, который является именем свойства:
class(mc.PropertyList(1).Name)
ans = char
Примените стандартную индексацию MATLAB®, чтобы получить доступ к информации в объектах метакласса.
Например, свойство meta.class
PropertyList
содержит массив объектов meta.property
. Следующее выражение получает доступ к первому объекту meta.property
в этом массиве и возвращает первое и последнее (C
и t
) буквы от вектора char
, содержавшегося в свойстве meta.property
Name
.
mc.PropertyList(1).Name([1 end])
ans = Ct
Этот пример реализует функцию, которая находит свойства с определенными значениями атрибута. Например, вы можете:
Найдите объекты, которые задают постоянные свойства (набор атрибута Constant
к true
).
Определите, какие свойства только для чтения (GetAccess = public
, SetAccess = private
).
Функция findAttrValue
возвращает массив ячеек имен свойства, которые устанавливают заданный атрибут.
Информация о доступах к функции findAttrValue
от метаданных с помощью этих методов:
Если входной параметр, obj
, является вектором char
, используйте статический метод meta.class.fromName
получить объект meta.class
.
Если входной параметр, obj
, является объектом, используйте функцию metaclass
, чтобы получить объект meta.class
.
Каждое свойство имеет связанный объект meta.property
. Получите эти объекты из свойства meta.class
PropertyList
.
Используйте класс handle
метод findprop
, чтобы определить, является ли требуемый атрибут свойства допустимым названием атрибута. Все атрибуты свойства являются свойствами объекта meta.property
. Оператор, findobj(mp,'PropertyName')
определяет, имеет ли объект meta.property
, mp
, свойство под названием PropertyName
.
Ссылочные свойства объектов meta.property
с помощью динамических имен полей. Например, если attrName = 'Constant'
, то MATLAB преобразовывает выражение mp.(attrName)
в mp.Constant
Дополнительный третий аргумент позволяет вам задать значение атрибутов, значениями которых не является логический true
или false
(такой как GetAccess
и SetAccess
).
function cl_out = findAttrValue(obj,attrName,varargin) if ischar(obj) mc = meta.class.fromName(obj); elseif isobject(obj) mc = metaclass(obj); end ii = 0; numb_props = length(mc.PropertyList); cl_array = cell(1,numb_props); for c = 1:numb_props mp = mc.PropertyList(c); if isempty (findprop(mp,attrName)) error('Not a valid attribute name') end attrValue = mp.(attrName); if attrValue if islogical(attrValue) || strcmp(varargin{1},attrValue) ii = ii + 1; cl_array(ii) = {mp.Name}; end end end cl_out = cl_array(1:ii); end
Предположим, что у вас есть следующий объект containers.Map
:
mapobj = containers.Map({'rose','bicycle'},{'flower','machine'});
Найдите свойства с private
SetAccess
:
findAttrValue(mapobj,'SetAccess','private')
ans = 'Count' 'KeyType' 'ValueType' 'serialization'
Найдите свойства с public
GetAccess
:
findAttrValue(mapobj,'GetAccess','public')
ans = 'Count' 'KeyType' 'ValueType'