Самоанализ класса с метаданными

Используя Метаданные классов

Используйте метаданные класса, чтобы получить информацию о классах и объектах программно. Например, можно определить значения атрибута для членов класса или получить список событий, заданных классом. Для основной информации о метаданных см. Метаданные классов.

Осмотр класса EmployeeData

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 свойство содержит только прямые суперклассы.

Inspect Properties

Найдите имена свойств заданными 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

Метакласс свойство EnumeratedValues

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

Похожие темы