MATLAB R2016a引入了一种用于限制对象属性类的文档化机制(我知道还有一种较旧的,不同的,未记录的方法,但我没有使用该方法).例如:
classdef MyClass
properties
myProperty RestrictedClass
end
end
Run Code Online (Sandbox Code Playgroud)
将限制属性myProperty,使其值必须是类RestrictedClass.
如果你已经实现了这样的类,有没有办法使用MATLAB的类元数据接口以编程方式发现受限制属性的类?
如果我使用的话,我希望如此
m = ?MyClass;
p = m.PropertyList(1);
Run Code Online (Sandbox Code Playgroud)
然后metaproperty对象p将包含有关它被限制的类的信息 - 但似乎没有.
有没有办法以编程方式发现它?该方法不需要涉及实际实例化类 - 因为它可能有副作用,也因为它需要使用Abstract类.
PS也不涉及解析类的源代码的任何事情.想象一下,我可能想要使用其源代码已被混淆的类来完成此操作pcode.
您可以使用未记录的技巧将对象转换为结构,以检查对象的非公共属性。这些meta.Property对象包含一个隐藏的meta.Validation对象属性,其中包含该属性的验证信息:
Validation with properties:\n\n Class: [1\xc3\x971 meta.class]\n Size: [1\xc3\x970 meta.ArrayDimension]\n ValidatorFunctions: {1\xc3\x970 cell}\nRun Code Online (Sandbox Code Playgroud)\n\n对于给定的示例类:
\n\nclassdef SOcode\n properties\n myProperty1 double\n myProperty2 struct\n end\nend\nRun Code Online (Sandbox Code Playgroud)\n\n我们可以检查 来meta.PropertyList找到我们需要的值:
>> test = struct(codemeta.PropertyList(1))\n\ntest = \n\n struct with fields:\n\n Name: 'myProperty1'\n\n ... snip ...\n\n Type: [1\xc3\x971 meta.type]\n Validation: [1\xc3\x971 meta.Validation]\n DefiningClass: [1\xc3\x971 meta.class]\n\n ... snip ...\nRun Code Online (Sandbox Code Playgroud)\n\n然后我们可以执行如下操作:
\n\ncodemeta = ?SOcode;\n\nnprops = numel(codemeta.PropertyList);\nvalidationclass = cell(nprops, 1);\n\nfor ii = 1:nprops\n validationclass{ii} = codemeta.PropertyList(ii).Validation.Class.Name;\nend\nRun Code Online (Sandbox Code Playgroud)\n\n并收到:
\n\n>> validationclass\n\nvalidationclass =\n\n 2\xc3\x971 cell array\n\n {'double'}\n {'struct'}\nRun Code Online (Sandbox Code Playgroud)\n