如何在 Mathematica 中使用 Java?
我有两个文件,GRASP.nb
和GRASP.java
,在同一个文件夹中(顺便说一句:GRASP=贪婪的随机自适应搜索过程)。GRASP.java
文件包含一个方法 public static int[] TSP(int[][] g, int numberOfIterations, int k)
。我想在 Mathematica 中调用此方法。
我在Mathematica文档中读到,也在这里,我应该写
Needs["JLink`"];
InstallJava[];
obj=JavaNew[NotebookDirectory[]~~"GRASP.java"]
或
Needs["JLink`"];
InstallJava[];
obj=LoadJavaClass[NotebookDirectory[]~~"GRASP.java"]
或类似的东西,但我尝试的任何事情都会返回错误。我有WinXP,Mathematica 7,Eclipse 3.6。
任何工作示例将不胜感激。
不要忘记先编译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的要求。
您链接到的 StackOverflow 帖子显示的是 Java 类 (GRASP) 的名称,而不是源文件的名称,作为参数传递,因此绝对会丢失.java
。此外,您需要编译源文件以生成GRASP.class
文件,因为这是实际可以加载的格式。这可能就像
javac GRASP.java
但它可能会更难,具体取决于该文件中的内容。同样,类的名称可能不仅仅是GRASP
- 如果文件中有一个package com.foo.something
语句,那么参数将被com.foo.something.GRASP
。