如何从 Tampermonkey 脚本访问 Java 类?
How do I access Java classes from a Tampermonkey script?
我有一个 Java class,对于 MWE 让我们说
package myjava;
public class Foo {
public Foo() {}
public int bar() {
return 1;
}
public static void main(String[] args) {
System.out.println(new Foo().bar());
}
}
它的位置被添加到 CLASSPATH 变量中,所以例如写
java myjava.Foo
在 Windows 命令行中有效。
现在我想从 Google Chrome 中的 Tampermonkey 脚本调用此方法。我在各个地方看到的例子好像都不行:
var Foo = Java.type("myjava.Foo");
var foo = new Foo();
var bar = foo.bar();
(如 documentation at Oracle 所建议)和
var foo = new Packages.myjava.Foo();
var bar = foo.bar();
(和其他一些变体)都在第一行抛出错误,不是因为特定的 class 未知,而是第一个标识符(Java
、Packages
, 我什至尝试简单地使用 new myjava.Foo()
).
显然,我似乎不知道如何从脚本中引用 Java class,但我也找不到有效的示例。正确的做法是什么?
编辑:正如我所注意到的,我链接到的网站提供的代码甚至不应该对网络浏览器的 Java 脚本引擎有效。
这对 tampermonkey 不起作用,因为这些脚本 运行 在浏览器的 javascript 引擎 (afaik) 上。 Java.type
函数是一个 Nashorn 扩展,这意味着它仅在 Nashorn 上的脚本为 运行 时可用。正如文档中提到的(这似乎是您找到该片段的地方):
This section describes how to access Java from a script interpreted by the Nashorn engine.
Nashorn 是 javascript 引擎的 Oracle JDK 实现。它是用 Java 编写的,因此作为扩展,它提供了与 Java 互操作的能力。但是 Java 和 javascript 是不同的语言,所以没有理由其他 javascript 引擎会 提供相同的 Java 互操作功能(不是每个 JS 运行时都绑定到 JVM,就像 Nashorn 一样)。
最后,我设法找到了一个解决方法,虽然有点麻烦:
可以使用 GM_xmlhttpRequest
将 POST
请求中的参数发送到本地主机上的 PHP 文件,本地 Web 服务器将它们作为命令行参数传递给Java class 有问题。然后它通过 echo
returns 结果,结果字符串可以从 responseText
字段中读取并在浏览器脚本中解释。
我有一个 Java class,对于 MWE 让我们说
package myjava;
public class Foo {
public Foo() {}
public int bar() {
return 1;
}
public static void main(String[] args) {
System.out.println(new Foo().bar());
}
}
它的位置被添加到 CLASSPATH 变量中,所以例如写
java myjava.Foo
在 Windows 命令行中有效。
现在我想从 Google Chrome 中的 Tampermonkey 脚本调用此方法。我在各个地方看到的例子好像都不行:
var Foo = Java.type("myjava.Foo");
var foo = new Foo();
var bar = foo.bar();
(如 documentation at Oracle 所建议)和
var foo = new Packages.myjava.Foo();
var bar = foo.bar();
(和其他一些变体)都在第一行抛出错误,不是因为特定的 class 未知,而是第一个标识符(Java
、Packages
, 我什至尝试简单地使用 new myjava.Foo()
).
显然,我似乎不知道如何从脚本中引用 Java class,但我也找不到有效的示例。正确的做法是什么?
编辑:正如我所注意到的,我链接到的网站提供的代码甚至不应该对网络浏览器的 Java 脚本引擎有效。
这对 tampermonkey 不起作用,因为这些脚本 运行 在浏览器的 javascript 引擎 (afaik) 上。 Java.type
函数是一个 Nashorn 扩展,这意味着它仅在 Nashorn 上的脚本为 运行 时可用。正如文档中提到的(这似乎是您找到该片段的地方):
This section describes how to access Java from a script interpreted by the Nashorn engine.
Nashorn 是 javascript 引擎的 Oracle JDK 实现。它是用 Java 编写的,因此作为扩展,它提供了与 Java 互操作的能力。但是 Java 和 javascript 是不同的语言,所以没有理由其他 javascript 引擎会 提供相同的 Java 互操作功能(不是每个 JS 运行时都绑定到 JVM,就像 Nashorn 一样)。
最后,我设法找到了一个解决方法,虽然有点麻烦:
可以使用 GM_xmlhttpRequest
将 POST
请求中的参数发送到本地主机上的 PHP 文件,本地 Web 服务器将它们作为命令行参数传递给Java class 有问题。然后它通过 echo
returns 结果,结果字符串可以从 responseText
字段中读取并在浏览器脚本中解释。