💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、豆包、星火、月之暗面及文生图、文生视频 广告
JavaScript Java Bridge API允许将Java对象注入JavaScript代码。这是一个强大的功能,允许从JavaScript访问Java功能。 **注意**: 要访问JavaScript并注入Java对象,请确保完全加载网页并启用JavaScript支持。如果您注入/注册Java对象然后加载网页,则所有已注册的Java对象都将被销毁,并且在加载的网页的JavaScript中不可用。 ### 注入Java对象 要将Java对象注入JavaScript,必须将Java对象与JavaScript对象的指定属性相关联。例如,您可以将新的java属性添加到全局窗口 JavaScript对象(其他对象也可以工作),并使用以下代码将此属性与Java对象关联: ``` JSValue window = browser.executeJavaScriptAndReturnValue("window"); window.asObject().setProperty("java", new JavaObject()); ``` 注意:要将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()); } }); ``` JavaObject的实现可以如下: ``` public static class JavaObject { public void print(String message) { System.out.println(message); } } ``` **注意**: 确保将Java对象注入哪个类/接口标记为public。只能通过JavaScript注册和访问公共类。 现在,JavaScript代码可以调用JavaObject 公共方法: ``` window.java.print('Hello Java!'); ``` **注意**: JavaScript代码只能访问/调用已注册Java对象的公共方法。 ### 从JSValue获取Java对象 您可以通过将Java对象设置为现有JavaScript对象的属性值来将其注入JavaScript: ``` JSValue window = browser.executeJavaScriptAndReturnValue("window"); window.asObject().setProperty("java", new JavaObject()); ``` 如果您在Java代码中读取属性值,则可以提取与此JavaScript值关联的Java对象: ``` JSValue value = window.asObject().getProperty("java"); if (value.isJavaObject()) { JavaObject object = (JavaObject) value.asJavaObject(); } ``` #### 示例:从JavaScript访问文件系统 您可以通过注入java.io.File对象为JavaScript提供对本地文件系统的访问: ``` JSValue window = browser.executeJavaScriptAndReturnValue("window"); window.asObject().setProperty("fileSystem", new File("/")); ``` 现在JavaScript可以 直接使用 java.io.File 实例: ``` window.fileSystem.listFiles()[0].getAbsolutePath(); ``` ### JavaScript如何调用Java方法 当JavaScript调用已注册Java对象的公共方法时,JxBrowser会自动将 JavaScript参数 转换为相应的Java对象/原始值 。 如果JxBrowser无法转换传递的JavaScript值或找到具有适当签名的方法,则会抛出JavaScript错误。 如果已注册的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到Java类型的转换 JavaScript和Java使用不同的原始类型。JxBrowser实现从JavaScript到Java类型的自动类型转换。以下是JxBrowser将JavaScript对象转换为Java等价物的方法: ![](https://box.kancloud.cn/2c1ed1412edc34628d60b2971b44dcda_426x699.png)