Java和Mathematica交互

Leo*_*Leo 4 java wolfram-mathematica

如何在Mathematica中使用Java?

我有两个文件,GRASP.nb并且GRASP.java在同一个文件夹中(BTW:GRASP =贪婪的随机自适应搜索程序).该GRASP.java文件包含一个方法public static int[] TSP(int[][] g, int numberOfIterations, int k).我想在Mathematica中调用这个方法.

我在Mathematica文档中读到,也在这里,我应该写

Needs["JLink`"]; 
InstallJava[]; 
obj=JavaNew[NotebookDirectory[]~~"GRASP.java"]
Run Code Online (Sandbox Code Playgroud)

要么

Needs["JLink`"]; 
InstallJava[]; 
obj=LoadJavaClass[NotebookDirectory[]~~"GRASP.java"]
Run Code Online (Sandbox Code Playgroud)

或类似的东西,但我尝试的任何东西,都会返回错误.我有WinXP,Mathematica 7,Eclipse 3.6.

任何工作的例子都将非常感激.

WRe*_*ach 7

不要忘记先编译Java类 - 不能GRASP.java直接加载.

编译后,请尝试以下操作:

Needs["JLink`"]
AddToClassPath[NotebookDirectory[]];
LoadJavaClass["GRASP"];
GRASP`TSP[{{1,2,3},{4,5,6}}, 7, 8]
Run Code Online (Sandbox Code Playgroud)

由于该TSP方法是静态方法,因此必须先加载Java类,然后才能访问它.请注意,该类成为名为Mathematica的上下文GRASP,并且静态方法在该上下文中作为符号进行访问(GRASP`TSP如上所示).

如果您要访问的方法是常规方法(非静态方法),则调用序列将如下所示:

Needs["JLink`"]
AddToClassPath[NotebookDirectory[]];
obj = JavaNew["GRASP"];
obj@someMethod[{{1,2,3},{4,5,6}}, 7, 8]
Run Code Online (Sandbox Code Playgroud)

所有这些都假定您的Java类包含在默认包中 - 这是一种不寻常的情况.如果类包含在命名包中,则语法如下:

Needs["JLink`"]
AddToClassPath[NotebookDirectory[]];
LoadJavaClass["com.stackoverflow.GRASP"];
com`stackoverflow`GRASP`TSP[{{1,2,3},{4,5,6}}, 7, 8]
Run Code Online (Sandbox Code Playgroud)

要么

Needs["JLink`"]
AddToClassPath[NotebookDirectory[]];
obj = JavaNew["com.stackoverflow.GRASP"];
obj@someMethod[{{1,2,3},{4,5,6}}, 7, 8]
Run Code Online (Sandbox Code Playgroud)

如果类在一个名为包(com.stackoverflow在我的例子),然后确保该类具有路径com/stackoverflow/GRASP.class相对于笔记本电脑.这是Java的要求,而不是Mathematica.