プロパティに関する情報の取得
matlab.metadata.Property オブジェクト
matlab.metadata.Property クラスを使用してプロパティ属性の値を確認します。matlab.metadata.Property オブジェクトの書き込み可能なプロパティは、関連付けられたプロパティの属性に対応しています。matlab.metadata.Property の書き込み可能なプロパティの値は、クラス定義内で指定されている属性値に対応しています。
プロパティの matlab.metadata.Property オブジェクトを matlab.metadata.Class オブジェクトから取得できます。クラスの matlab.metadata.Class オブジェクトを取得するには、次のようにします。
クラスのオブジェクトに対して関数
metaclassを使用します。?演算子をクラス名と共に使用します。
たとえば、BasicHandle クラスは 1 つのパブリック プロパティと 2 つのプライベート プロパティを定義します。
classdef BasicHandle < handle % BasicHandle Inherits from handle superclass % Defines 1 public and 2 private properties. properties (SetAccess = private) Date = date PassKey = randi(9,[1,7]) end properties Category {mustBeMember(Category,{'new','change'})} = 'new' end end
? 演算子とクラス名を使用して matlab.metadata.Class オブジェクトを作成します。
mc = ?BasicHandle
mc =
Class with properties:
Name: 'BasicHandle'
Description: 'Inherits from handle superclass'
DetailedDescription: ' Defines 1 public and 2 private properties.'
Hidden: 0
Sealed: 0
Abstract: 0
Enumeration: 0
ConstructOnLoad: 0
HandleCompatible: 1
InferiorClasses: [0×1 matlab.metadata.Class]
Namespace: [0×0 matlab.metadata.Namespace]
Aliases: [0×1 string]
RestrictsSubclassing: 0
PropertyList: [3×1 matlab.metadata.Property]
MethodList: [24×1 matlab.metadata.Method]
EventList: [1×1 matlab.metadata.Event]
EnumerationMemberList: [0×1 matlab.metadata.EnumerationMember]
SuperclassList: [1×1 matlab.metadata.Class]
PropertyList という名前の matlab.metadata.Class オブジェクト プロパティには、クラスによって定義されたプロパティごとに 1 配列ずつ、matlab.metadata.Property オブジェクトの配列が含まれています。たとえば、要素 1 内の matlab.metadata.Property オブジェクトに関連付けられているプロパティの名前は、以下のとおりです。
mc.PropertyList(1).Name
ans = Date
matlab.metadata.Class オブジェクトには、非表示プロパティを含むすべてのプロパティの matlab.metadata.Property オブジェクトが含まれています。関数 properties はパブリック プロパティのみを返します。
ハンドル クラスでは handle findprop メソッドを使用して、特定のプロパティの matlab.metadata.Property オブジェクトを取得します。
たとえば、BasicHandle クラスの Category プロパティの matlab.metadata.Property オブジェクトを検出します。
h = BasicHandle;
mp = findprop(h,'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
PartialMatchPriority: 1
GetMethod: []
SetMethod: []
HasDefault: 1
DefaultValue: 'new'
Validation: [1×1 matlab.metadata.Validation]
DefiningClass: [1×1 matlab.metadata.Class]
matlab.metadata.Property の表示には、BasicHandle オブジェクトの既定の Category プロパティの 1 つが以下であることが示されています。
パブリックの
GetAccessおよびSetAccessをもつ既定値
newをもつ
プロパティの属性の一覧は、プロパティの属性の表を参照してください。
メタクラス オブジェクトのインデックス化の方法
matlab.metadata.Class オブジェクト プロパティから直接、他のメタクラス オブジェクトにアクセスできます。たとえば、以下のステートメントは、
mc = ?containers.Map;
matlab.metadata.Class オブジェクトを以下のように返します。
class(mc)
ans =
matlab.metadata.ClassPropertyList matlab.metadata.Class プロパティを参照すると、以下のように containers.Map クラスの各プロパティに対して 1 つの matlab.metadata.Property オブジェクトがある配列が返されます。
class(mc.PropertyList)
ans = matlab.metadata.Property
各配列要素は 1 つの matlab.metadata.Property オブジェクトです。
mc.Properties(1)
ans =
[1x1 matlab.metadata.Property]matlab.metadata.Property オブジェクトの Name プロパティには、プロパティの名前である char ベクトルが含まれています。
class(mc.PropertyList(1).Name)
ans = char
標準の MATLAB® インデックス処理を適用すると、メタクラス オブジェクト内の情報にアクセスできます。
たとえば、matlab.metadata.Class PropertyList プロパティには matlab.metadata.Property オブジェクトの配列が含まれています。次の式はこの配列内の最初の matlab.metadata.Property オブジェクトにアクセスし、matlab.metadata.Property の Name プロパティ内に含まれている char ベクトルの最初と最後の文字 (C と t) を返します。
mc.PropertyList(1).Name([1 end])
ans = Ct
特定の属性をもつプロパティの検出方法
この例では、特定の属性値のあるプロパティを検出する関数を実装します。たとえば、次のようなことができます。
定数プロパティ (
Constant属性の設定がtrue) を定義するオブジェクトを検出します。どのプロパティが読み取り専用 (
GetAccess = public、SetAccess = private) かを判別します。
関数 findAttrValue は、指定された属性を設定するプロパティ名の cell 配列を返します。関数は、以下の手法を使用してメタデータからの情報にアクセスします。
入力引数
objがcharベクトルの場合、matlab.metadata.Class.fromName静的メソッドを使用すると、matlab.metadata.Classオブジェクトを取得できます。入力引数
objがオブジェクトの場合、関数metaclassを使用するとmatlab.metadata.Classオブジェクトを取得できます。各プロパティには、関連付けられた
matlab.metadata.Propertyオブジェクトがあります。これらのオブジェクトをmatlab.metadata.ClassPropertyListプロパティから取得します。要求されたプロパティの属性が有効な属性名かどうかを判別するには、
handleクラスのfindpropメソッドを使用します。すべてのプロパティ属性は、matlab.metadata.Propertyオブジェクトのプロパティです。ステートメントfindobj(mp,'PropertyName')は、matlab.metadata.PropertyオブジェクトmpにPropertyNameと呼ばれるプロパティがあるかどうかを判定します。動的フィールド名を使用して
matlab.metadata.Propertyオブジェクト プロパティを参照します。たとえば、attrName = 'Constant'の場合、MATLAB は、式mp.(attrName)をmp.Constantに変換します。オプションである 3 番目の引数を使用すると、
GetAccessやSetAccessなど、属性値が論理値trueまたはfalseでない属性の値を指定できます。
function cl_out = findAttrValue(obj,attrName,varargin) if ischar(obj) mc = matlab.metadata.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'