如何在Mathematica中使用Java?
我在同一个文件夹中有两个文件GRASP.nb
和GRASP.java
(BTW:GRASP =贪婪的随机自适应搜索程序)。 GRASP.java
文件包含方法public static int[] TSP(int[][] g, int numberOfIterations, int k)
。我想在Mathematica中称这种方法。
我在Mathematica文档和here中读到了我应该写的
Needs["JLink`"];
InstallJava[];
obj=JavaNew[NotebookDirectory[]~~"GRASP.java"]
或
Needs["JLink`"];
InstallJava[];
obj=LoadJavaClass[NotebookDirectory[]~~"GRASP.java"]
或类似的东西,但我尝试的任何东西都会返回错误。我有WinXP,Mathematica 7,Eclipse 3.6。
非常感谢任何工作实例。
答案 0 :(得分:7)
不要忘记先编译Java类 - 不能直接加载GRASP.java
。
编译完成后,请尝试以下操作:
Needs["JLink`"]
AddToClassPath[NotebookDirectory[]];
LoadJavaClass["GRASP"];
GRASP`TSP[{{1,2,3},{4,5,6}}, 7, 8]
由于TSP
方法是静态方法,因此必须先加载Java类,然后才能访问它。请注意,该类成为名为GRASP
的Mathematica上下文,静态方法在该上下文中作为符号进行访问(GRASP`TSP
,如上所示)。
如果您要访问的方法是常规方法(非静态方法),则调用序列将显示为:
Needs["JLink`"]
AddToClassPath[NotebookDirectory[]];
obj = JavaNew["GRASP"];
obj@someMethod[{{1,2,3},{4,5,6}}, 7, 8]
所有这些都假定您的Java类包含在默认包中 - 这是一种不寻常的情况。如果类包含在命名包中,则语法如下:
Needs["JLink`"]
AddToClassPath[NotebookDirectory[]];
LoadJavaClass["com.stackoverflow.GRASP"];
com`stackoverflow`GRASP`TSP[{{1,2,3},{4,5,6}}, 7, 8]
或
Needs["JLink`"]
AddToClassPath[NotebookDirectory[]];
obj = JavaNew["com.stackoverflow.GRASP"];
obj@someMethod[{{1,2,3},{4,5,6}}, 7, 8]
如果 类在命名包中(我的示例中为com.stackoverflow
),请确保该类具有相对于笔记本的路径com/stackoverflow/GRASP.class
。这是Java的要求,而不是Mathematica。
答案 1 :(得分:1)
您链接到的StackOverflow帖子显示了Java类的名称(GRASP),而不是源文件的名称,作为参数传递,因此绝对会丢失.java
。此外,您需要编译源文件以生成GRASP.class
文件,因为这是可以实际加载的格式。这可能就像
javac GRASP.java
但可能更难,取决于该文件中的内容。同样,类的名称可能不仅仅是GRASP
- 如果文件中有package com.foo.something
语句,则参数将为com.foo.something.GRASP
。