Note: Advice in this article will only work for JxBrowser 6. See the corresponding article for JxBrowser 7 here.(注意:本文中的建议仅适用于JxBrowser6,JxBrowser7相应文章请点击这里。)


JavaScript Java Bridge API allows injecting Java objects into JavaScript code. This is a powerful feature that allows accessing Java functionality from JavaScript.(JavaScript Java Bridge API允许将Java对象注入JavaScript代码。这是一个很牛逼的功能,可以从JavaScript访问Java功能。)


Note: To access JavaScript and inject Java object, make sure that web page is loaded completely and JavaScript support is enabled. If you inject/register Java object and then load web page, all registered Java objects will be destroyed and will not be available in JavaScript of the loaded web page.(注意:要访问JavaScript并注入Java对象,请确保已完全加载网页并启用了JavaScript支持。如果您先注入/注册Java对象,再加载网页,则所有注册的Java对象将被破坏,并且无法在加载的网页的JavaScript中使用。)


Injecting Java Objects(注入Java对象)

To inject Java object into JavaScript you must associate the Java object with specified property of a JavaScript object. For example, you can add a new java property to global window JavaScript object (other objects would work as well) and associate this property with Java object using the following code:(要将Java对象注入JavaScript,必须将Java对象与JavaScript对象的指定属性相关联。例如,您可以向全局JavaScript对象window添加一个新的java属性(其他对象也可以使用),并使用以下代码将此属性与Java对象相关联:)

JSValue window = browser.executeJavaScriptAndReturnValue("window");
window.asObject().setProperty("java", new JavaObject());

Note: To inject Java object into JavaScript code, we recommend that you use the following approach:(注意:要将Java对象注入JavaScript代码,建议您使用以下方法:)

browser.addScriptContextListener(new ScriptContextAdapter() {
    @Override
    public void onScriptContextCreated(ScriptContextEvent event) {
        Browser browser = event.getBrowser();
        JSValue window = browser.executeJavaScriptAndReturnValue("window");
        window.asObject().setProperty("java", new JavaObject());
    }
});

Implementation of JavaObject can be the following:(JavaObject的实现可以如下:)

public static class JavaObject {
    public void print(String message) {
        System.out.println(message);
    }
}

Note: Make sure that you inject Java object which class/interface is marked as public. Only public classes can be registered and accessed from JavaScript.(注意:确保注入的Java对象的类/接口被标记为public。JavaScript只能注册和访问公共类。)


Now JavaScript code can invoke JavaObject public methods:(现在,JavaScript代码可以调用JavaObject公共方法:)

window.java.print('Hello Java!');

Note: JavaScript code can access/invoke only public methods of registered Java object.(注意:JavaScript代码只能访问/调用已注册Java对象的公共方法。)


Getting Java Object from JSValue(从JSValue获取Java对象)

You can inject Java object into JavaScript by setting it as a property value for existing JavaScript object: (您可以通过将Java对象设置为现有JavaScript对象的属性值来将其注入JavaScript:)

JSValue window = browser.executeJavaScriptAndReturnValue("window");
window.asObject().setProperty("java", new JavaObject());

If you read the property value in Java code, then you can extract Java object associated with this JavaScript value:(如果您以Java代码读取属性值,则可以提取与此JavaScript值关联的Java对象:)

JSValue value = window.asObject().getProperty("java");
if (value.isJavaObject()) {
    JavaObject object = (JavaObject) value.asJavaObject();
}


Example: Accessing File System from JavaScript(示例:从JavaScript访问文件系统)

You can provide JavaScript with access to local file system by injecting java.io.File object:(您可以通过注入java.io.File对象为JavaScript提供对本地文件系统的访问:)

JSValue window = browser.executeJavaScriptAndReturnValue("window");
window.asObject().setProperty("fileSystem", new File("/"));

Now JavaScript can work with the java.io.File instance directly:(现在,JavaScript可以直接与java.io.File实例一起使用:)

window.fileSystem.listFiles()[0].getAbsolutePath();


How JavaScript calls Java method(JavaScript如何调用Java方法)

When JavaScript calls a public method of a registered Java object, JavaScript parameters are automatically converted to corresponding Java objects/primitive values by JxBrowser.(当JavaScript调用已注册Java对象的公共方法时,JxBrowser会将JavaScript参数自动转换为相应的Java对象/原始值。)


If JxBrowser cannot convert passed JavaScript values or find a method with appropriate signature, JavaScript error will be thrown.(如果JxBrowser无法转换传递的JavaScript值或找到具有适当签名的方法,则将引发JavaScript错误。)


If registered Java object has several methods with same name and number of parameters, but different parameter types, JavaScript will invoke the first method declared in Java class. For example, if you register the following Java object:(如果已注册的Java对象具有名称和参数数量相同但参数类型不同的多个方法,则JavaScript将调用Java类中声明的第一个方法。例如,如果您注册以下Java对象:)

public class JavaObject {
    public void doAction(int arg1, double arg2) {}
    public void doAction(double arg1, int arg2) {}
    public void doAction(double arg1, double arg2) {}
}

JavaScript to Java types conversion(JavaScript到Java类型的转换)

JavaScript and Java work with different primitive types. JxBrowser implements automatic types conversion from JavaScript to Java types. Here's how JavaScript objects will be converted to their Java equivalents by JxBrowser:(JavaScript和Java使用不同的原始类型。 JxBrowser实现了从JavaScript到Java类型的自动类型转换。 JxBrowser将JavaScript对象转换为Java等效对象的方式如下:)


JavaScript Java
Number double
float
long
int
short
byte
java.lang.Double
java.lang.Float
java.lang.Long
java.lang.Integer
java.lang.Short
java.lang.Byte
Boolean boolean
java.lang.Boolean
String java.lang.String
null null
Object com.teamdev.jxbrowser.chromium.JSObject
Array com.teamdev.jxbrowser.chromium.JSArray
Function com.teamdev.jxbrowser.chromium.JSFunction