メタデータによるクラス イントロスペクション
クラスのメタデータの使用
クラスのメタデータを使用して、クラスとオブジェクトに関する情報をプログラムにより取得します。たとえば、クラス メンバーの属性値を判別したり、クラスによって定義されたイベントのリストを取得したりできます。メタデータに関する基本的な情報については、クラスのメタデータを参照してください。
EmployeeData クラスの検査
EmployeeData
クラスは、2 つのプロパティをもつ handle
クラスです。そのうちの 1 つは Access
がプライベートに設定され、set アクセス メソッドが定義されています。
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
クラスを使用して、?
演算子で matlab.metadata.Class
オブジェクトを作成します。
mc = ?EmployeeData;
どの EmployeeData
クラスから派生したかを以下のように特定します。返される値は handle
スーパークラスの matlab.metadata.Class
オブジェクトです。
a = mc.SuperclassList; a.Name
ans = handle
EmployeeData
クラスにあるスーパークラスは 1 つだけです。直接のスーパークラスを複数もつクラスでは、a
に各スーパークラスの matlab.metadata.Class
オブジェクトが含まれます。
インデックス付きの参照を使用して、特定のスーパークラスを参照します。
a(1).Name
または、直接 mc
から参照します。
mc.SuperclassList(1).Name
ans = handle
SuperclassList
プロパティには直接のスーパークラスのみが含まれます。
プロパティの検査
EmployeeData
クラスによって定義されているプロパティの名前を検索します。最初に、matlab.metadata.Class
PropertyList
プロパティから、matlab.metadata.Property
オブジェクトの配列を取得します。
mc = ?EmployeeData; mpArray = mc.PropertyList;
mpArray
の長さは 2 つの matlab.metadata.Properties
オブジェクトが存在することを示しています。EmployeeData
クラスで定義された各プロパティに 1 つずつです。
length(mpArray) ans = 2
ここで、配列から matlab.metadata.Property
オブジェクトを取得します。
prop1 = mpArray(1); prop1.Name
ans = EmployeeName
matlab.metadata.Property
オブジェクトの Name
プロパティは、matlab.metadata.Property
オブジェクトによって表されるクラス プロパティを識別します。
matlab.metadata.Property
オブジェクトの他のプロパティをクエリして、EmployeeName
プロパティの属性を特定します。
特定の属性をもつコンポーネントの検出
インデックス手法を使用して、特定の属性値をもつクラス コンポーネントを一覧表示できます。たとえば、次のコードは、private
アクセスをもつ EmployeeData
クラス内のメソッドを一覧表示します。
mc = ?EmployeeData;
mc.PropertyList(ismember({mc.PropertyList(:).SetAccess},'private')).Name
ans = EmployeeNumber
Access
は matlab.metadata.Property
クラスのプロパティではありません。matlab.metadata.Property
クラスのプロパティである、SetAccess
と GetAccess
を使用します。
次のようなステートメントを使用して、論理値の属性をもつコンポーネントを検出します。
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
EmployeeName
プロパティの set アクセス関数の関数 handle
を以下のように取得します。
mpArray(1).SetMethod
ans = @D:\MyDir\@EmployeeData\EmployeeData.m>EmployeeData.set.EmployeeName
メタクラス EnumeratedValues プロパティ
matlab.metadata.Class
EnumerationMemberList
プロパティには、各列挙メンバーにつき 1 つの matlab.metadata.EnumerationMember
オブジェクト配列が含まれます。matlab.metadata.EnumerationMember
Name
プロパティを使用して、列挙クラスにより定義された列挙メンバー名を取得します。たとえば、以下の WeekDays
列挙クラスを考えてみましょう。
classdef WeekDays enumeration Monday, Tuesday, Wednesday, Thursday, Friday end end
matlab.metadata.Class
オブジェクトから列挙型名をクエリします。
mc = ?WeekDays; mc.EnumerationMemberList(2).Name
ans = Tuesday