MATLAB:发现受限制的属性类

Sam*_*rts 6 oop matlab

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.

exc*_*aza 2

您可以使用未记录的技巧将对象转换为结构,以检查对象的非公共属性。这些meta.Property对象包含一个隐藏的meta.Validation对象属性,其中包含该属性的验证信息:

\n\n
  Validation with properties:\n\n                 Class: [1\xc3\x971 meta.class]\n                  Size: [1\xc3\x970 meta.ArrayDimension]\n    ValidatorFunctions: {1\xc3\x970 cell}\n
Run Code Online (Sandbox Code Playgroud)\n\n

对于给定的示例类:

\n\n
classdef SOcode\n    properties\n        myProperty1 double\n        myProperty2 struct\n    end\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

我们可以检查 来meta.PropertyList找到我们需要的值:

\n\n
>> 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 ...\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后我们可以执行如下操作:

\n\n
codemeta = ?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\n
Run Code Online (Sandbox Code Playgroud)\n\n

并收到:

\n\n
>> validationclass\n\nvalidationclass =\n\n  2\xc3\x971 cell array\n\n    {'double'}\n    {'struct'}\n
Run Code Online (Sandbox Code Playgroud)\n