Используйте 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 используйте handle
findprop метод, чтобы получить 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 отобразитесь показывает что BasicHandle по умолчанию объект Category свойство:
Имеет общедоступный 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'