Используйте класс 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'