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