Main Content

メタデータによるクラス イントロスペクション

クラスのメタデータの使用

クラスのメタデータを使用して、クラスとオブジェクトに関する情報をプログラムにより取得します。たとえば、クラス メンバーの属性値を判別したり、クラスによって定義されたイベントのリストを取得したりできます。メタデータに関する基本的な情報については、クラスのメタデータを参照してください。

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 クラスを使用して、? 演算子で meta.class オブジェクトを作成します。

mc = ?EmployeeData;

どの EmployeeData クラスから派生したかを以下のように特定します。返される値は handle スーパークラスの meta.class オブジェクトです。

a = mc.SuperclassList;
a.Name
ans =

handle

EmployeeData クラスにあるスーパークラスは 1 つだけです。直接のスーパークラスを複数もつクラスでは、a に各スーパークラスの meta.class オブジェクトが含まれます。

インデックス付きの参照を使用して、特定のスーパークラスを参照します。

a(1).Name

または、直接 mc から参照します。

mc.SuperclassList(1).Name
ans =

handle

SuperclassList プロパティには直接のスーパークラスのみが含まれます。

プロパティの検査

EmployeeData クラスによって定義されているプロパティの名前を検索します。最初に、meta.class PropertyList プロパティから、meta.properties オブジェクトの配列を取得します。

mc = ?EmployeeData;
mpArray = mc.PropertyList;

mpArray の長さは 2 つの meta.property オブジェクトがあることを示しています。EmployeeData クラスで定義された各プロパティに 1 つずつです。

length(mpArray)
ans =
     2

ここで、配列から meta.property オブジェクトを取得します。

prop1 = mpArray(1);
prop1.Name
ans =

EmployeeName 

meta.propertyName プロパティは、meta.property オブジェクトによって表現されるクラス プロパティを識別します。

meta.property オブジェクトの他のプロパティをクエリして、EmployeeName プロパティの属性を特定します。

特定の属性をもつコンポーネントの検出

インデックス手法を使用して、特定の属性値をもつクラス コンポーネントを一覧表示できます。たとえば、次のコードは、private アクセスをもつ EmployeeData クラス内のメソッドを一覧表示します。

mc = ?EmployeeData;
mc.PropertyList(ismember({mc.PropertyList(:).SetAccess},'private')).Name
ans =

EmployeeNumber

Accessmeta.property クラスのプロパティではありません。meta.property クラスのプロパティである、SetAccessGetAccess を使用します。

次のようなステートメントを使用して、論理値の属性をもつコンポーネントを検出します。

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 プロパティ

meta.class EnumeratedValues プロパティは、列挙メンバーごとに 1 つの 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

関連するトピック