寻找洞察未经证实的使用MATLAB的方法()函数

时间:2013-03-20 21:10:28

标签: matlab matlab-class

我看了一遍,但没有看到记录[a b] = methods(classname)。我的意思是,记录单变量输出,但不记录双变量输出。我在MATLAB或未记录的matlab中看不到任何文档,或者甚至在这里。也许我错过了它?

如果我用matlab类调用它,例如char

[a b] = methods(char); 

然后a是char的方法列表,b[]

但是......

对于java类,b具有一些有用的值。假设javaClass是java类或java类名。

通常,我会拨打a = method(javaClass)a = method(javaClass,'-full')。但是,我注意到我也可以打电话

[a b] = method(javaClass)

当我这样做时:

  • a是一个包含所有类方法名称的唯一列表的单元格。 (正如预期的那样)
  • b是一个N x 6个字符串单元格,每列代表:
    1. 'static'如果是静态,则[]否则
    2. 完全合格的回归课程
    3. 方法名称
    4. 完全限定的方法名称
    5. 输入参数(括号内)或()
    6. '抛出 fully.qualified.exception.name '或[]

示例:

[a b] = method(java.lang.Integer);

然后,a是< 32x1 cell>包含简单名称,例如'Integer''bitCount'

但是,b是<43x6单元&gt;包含每个函数的每个变体。例如,valueOf函数之一将显示

COL  VALUE
1.   static
2.   java.lang.Integer
3.   valueOf
4.   java.lang.Integer.valueOf
5.   (java.lang.String)
6.   throws java.lang.NumberFormatException`

所以,这是我的问题:

主要问题:使用这完全不安全吗?因为它没有证件,我会这么认为;但是它为我提供了一些内置的功能,不用复制就可以了。解析的解决方法并不可恶,但此功能已经存在。

这是从哪里来的?也就是说,这实际上是来自MATLAB函数,还是它正在使用的某些Java函数?

有没有人使用它?或者(如在主要问题中)应该避免吗?

有关于此的文件吗?除了这篇文章,我的意思是。我的意思是,当然,它似乎是一个直接的功能......对于任何重要的人来说,这是否足够有趣?

我在MATLAB 2011b上,这个功能在MATLAB(2013a)的更高版本中是否仍然存在?

2 个答案:

答案 0 :(得分:5)

对于MATLAB自己的类(classdef样式),您可以使用metadata system获取类似信息:

mc = ?timer
mc.MethodList

使用上面显示的methods似乎对Java类和对象特别有用。检查methodsview函数的源代码,该函数在内部使用methods的两个输出。

edit methodsview

methodsview

答案 1 :(得分:4)

Matlab包括许多此类无证件的掘金,我自2009年以来就在我的UndocumentedMatlab.com网站上进行了记录(该网站几天前已经过了4岁生日)。其中大部分都与Matlab-Java接口有关(我在其上写了book),但也有许多pure-Matlab未记录的特性和功能非常有用。

在未来的Matlab兼容性方面,其中一些功能比其他功能更具风险。我认为methods的第二个输出arg是低风险的。它确实没有文档记录,但已经存在了它的当前形式多年(至少十年,可能更多)。它仍然可用于R2013a。正如Amro所说,它由内部methodsview函数使用,并且完全可以安全使用。

如果您有兴趣在Matlab中获取有关Java对象的信息,请考虑使用提供比methods或{{1}更多信息的uiinspectcheckClass实用程序。 }。 methodsviewuiinspect都处理多种类型的对象句柄和类名,包括Java,COM,Matlab类和HG句柄(只有checkClass的HG)。提供了uiinspect的技术说明here


在Java,COM和Matlab上使用的

uiinspect处理: <code>uiinspect</code> being used on Java, COM and Matlab handles


uiinspect用于Java对象或类名:

<code>checkClass</code> being used on a Java object