Java 教程
- Java - 首页
- Java - 概述
- Java - 历史
- Java - 特性
- Java 与 C++
- JVM - Java 虚拟机
- Java - JDK 与 JRE 与 JVM
- Java - Hello World 程序
- Java - 环境搭建
- Java - 基本语法
- Java - 变量类型
- Java - 数据类型
- Java - 类型转换
- Java - Unicode 系统
- Java - 基本运算符
- Java - 注释
- Java - 用户输入
- Java - 日期和时间
Java 控制语句
- Java - 循环控制
- Java - 决策制定
- Java - If-else
- Java - Switch
- Java - For 循环
- Java - For-Each 循环
- Java - While 循环
- Java - do-while 循环
- Java - Break
- Java - Continue
面向对象编程
- Java - OOPs 概念
- Java - 对象和类
- Java - 类属性
- Java - 类方法
- Java - 方法
- Java - 变量作用域
- Java - 构造函数
- Java - 访问修饰符
- Java - 继承
- Java - 聚合
- Java - 多态
- Java - 重写
- Java - 方法重载
- Java - 动态绑定
- Java - 静态绑定
- Java - 实例初始化块
- Java - 抽象
- Java - 封装
- Java - 接口
- Java - 包
- Java - 内部类
- Java - 静态类
- Java - 匿名类
- Java - 单例类
- Java - 包装类
- Java - 枚举
- Java - 枚举构造函数
- Java - 枚举字符串
Java 内置类
Java 文件处理
Java 错误和异常
- Java - 异常
- Java - try-catch 块
- Java - try-with-resources
- Java - 多重 catch 块
- Java - 嵌套 try 块
- Java - Finally 块
- Java - throw 异常
- Java - 异常传播
- Java - 内置异常
- Java - 自定义异常
Java 多线程
- Java - 多线程
- Java - 线程生命周期
- Java - 创建线程
- Java - 启动线程
- Java - 线程连接
- Java - 线程命名
- Java - 线程调度器
- Java - 线程池
- Java - 主线程
- Java - 线程优先级
- Java - 守护线程
- Java - 线程组
- Java - 关闭钩子
Java 同步
Java 网络编程
- Java - 网络编程
- Java - Socket 编程
- Java - URL 处理
- Java - URL 类
- Java - URLConnection 类
- Java - HttpURLConnection 类
- Java - Socket 类
- Java - 泛型
Java 集合
Java 接口
Java 数据结构
Java 集合算法
高级 Java
- Java - 命令行参数
- Java - Lambda 表达式
- Java - 发送邮件
- Java - Applet 基础
- Java - Javadoc 注释
- Java - 自动装箱和拆箱
- Java - 文件不匹配方法
- Java - REPL (JShell)
- Java - 多版本 Jar 文件
- Java - 私有接口方法
- Java - 内部类菱形运算符
- Java - 多分辨率图像 API
- Java - 集合工厂方法
- Java - 模块系统
- Java - Nashorn JavaScript
- Java - Optional 类
- Java - 方法引用
- Java - 函数式接口
- Java - 默认方法
- Java - Base64 编码解码
- Java - Switch 表达式
- Java - Teeing 收集器
- Java - 微基准测试
- Java - 文本块
- Java - 动态 CDS 档案
- Java - Z 垃圾收集器 (ZGC)
- Java - 空指针异常
- Java - 打包工具
- Java - 密封类
- Java - 记录类
- Java - 隐藏类
- Java - 模式匹配
- Java - 紧凑数字格式化
- Java - 垃圾回收
- Java - JIT 编译器
Java 杂项
- Java - 递归
- Java - 正则表达式
- Java - 序列化
- Java - 字符串
- Java - 进程 API 改进
- Java - 流 API 改进
- Java - 增强型 @Deprecated 注解
- Java - CompletableFuture API 改进
- Java - 流
- Java - 日期时间 API
- Java 8 - 新特性
- Java 9 - 新特性
- Java 10 - 新特性
- Java 11 - 新特性
- Java 12 - 新特性
- Java 13 - 新特性
- Java 14 - 新特性
- Java 15 - 新特性
- Java 16 - 新特性
Java API 和框架
Java 类参考
- Java - Scanner
- Java - 数组
- Java - 字符串
- Java - Date
- Java - ArrayList
- Java - Vector
- Java - Stack
- Java - PriorityQueue
- Java - LinkedList
- Java - ArrayDeque
- Java - HashMap
- Java - LinkedHashMap
- Java - WeakHashMap
- Java - EnumMap
- Java - TreeMap
- Java - IdentityHashMap
- Java - HashSet
- Java - EnumSet
- Java - LinkedHashSet
- Java - TreeSet
- Java - BitSet
- Java - Dictionary
- Java - Hashtable
- Java - Properties
- Java - Collection
- Java - Array
Java 有用资源
Java - Nashorn JavaScript 引擎
Nashorn JavaScript 引擎
Nashorn 是 Java 中一个非常强大且性能优异的 JavaScript 引擎。它在 Java 8 中引入,用于替换现有的 JavaScript 引擎 Rhino。Nashorn 引擎的性能比其之前的对应版本快 2 到 10 倍。它可以将 JavaScript 代码直接编译成内存中的字节码。它利用 Java 7 中引入的动态特性来提高性能。
使用 Nashorn 引擎,我们可以在命令行工具中执行 JavaScript 代码。我们可以在 Java 文件中嵌入 JavaScript 代码,并在 Java 代码库中调用 JavaScript 方法。我们还可以使用 jjs 在 JavaScript 中调用 Java 方法。
通过命令行工具执行 JavaScript
对于 Nashorn 引擎,JAVA 8 引入了一个新的命令行工具 jjs,用于在控制台中执行 JavaScript 代码。jjs 是一个多功能的工具,它可以解释 JavaScript 文件以及 JavaScript 代码片段。我们甚至可以使用 jjs 在 JavaScript 代码中调用 Java 方法。
示例
解释 js 文件
首先尝试在 c:\> JAVA 文件夹中创建并保存文件 sample.js。此 sample.js 文件包含一条 JavaScript 语句,使用 print() 方法在控制台上打印“Hello World”。
sample.js
print('Hello World!');
打开控制台并使用以下命令。此处 jjs 将读取 sample.js 文件,解释 JavaScript 代码片段并执行代码。
C:\JAVA>jjs sample.js
它将产生以下输出
Hello World!
让我们更新 sample.js 以包含一个要调用的 JavaScript 函数。
sample.js
function sayMessage(){ print('Hello World!'); } sayMessage();
打开控制台并使用以下命令。
C:\JAVA>jjs sample.js
它将产生以下输出
Hello World!
我们也可以直接使用 jjs 评估或执行 JavaScript 代码片段。
在命令提示符下直接执行 JavaScript
打开控制台并键入 jjs,然后按 Enter 键。jjs 工具将打开一个交互式会话。打开 jjs 会话后,我们可以执行 JavaScript 代码。完成后,键入 quit() 并按 Enter 键退出 jjs 交互式会话并返回到命令提示符。
示例
C:\JAVA>jjs jjs> print("Hello, World!") Hello, World! jjs> quit() >> C:\JAVA>
将参数传递给 jjs
jjs 使用一个特殊的构造 arguments 来存储传递的 命令行参数。请参见下面的示例
打开控制台并使用以下命令。
示例
C:\JAVA> jjs -- a b c jjs> print('letters: ' +arguments) letters: a,b,c jjs> quit() >> C:\JAVA>
从 Java 调用 JavaScript
从 Java 6 开始,Java 就有 ScriptEngineManager 类,可用于将 JavaScript 引擎加载为 ScriptEngine 实例。在 Java 代码中加载引擎后,我们可以调用 eval() 方法在 Java 中评估 JavaScript 代码。我们甚至可以在 JavaScript 代码片段中使用 Java 变量。
示例
使用您选择的任何编辑器(例如,在 C:\> JAVA 中)创建以下 Java 程序。
Java8Tester.java
import javax.script.ScriptEngineManager; import javax.script.ScriptEngine; import javax.script.ScriptException; public class Java8Tester { public static void main(String args[]) { // create the script engine manager ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); // load the Nashorn javascript engine ScriptEngine nashorn = scriptEngineManager.getEngineByName("nashorn"); String name = "Mahesh"; Integer result = null; try { // call the javascript function, pass a java variable nashorn.eval("print('" + name + "')"); // call the javascript function and get the result back in java result = (Integer) nashorn.eval("10 + 2"); } catch(ScriptException e) { System.out.println("Error executing script: "+ e.getMessage()); } System.out.println(result.toString()); } }
验证结果
使用javac编译器编译该类,如下所示:
C:\JAVA>javac Java8Tester.java
现在运行 Java8Tester,如下所示:
C:\JAVA>java Java8Tester
它应该产生以下结果:
Mahesh 12
从 JavaScript 调用 Java
使用 jjs 工具,我们甚至可以在 JavaScript 代码片段中调用 Java 代码。在下面的示例中,我们首先使用 Java.type(' java.math.BigDecimal ') 创建了一个 BigDecimal 类型。加载 BigDecimal 类后,我们可以在 JavaScript 代码中使用其方法,如下所示
示例
在 c:\> JAVA 文件夹中创建并保存sample.js。
sample.js
// import BigDecimal java class var BigDecimal = Java.type('java.math.BigDecimal'); function calculate(amount, percentage) { // use the BigDecimal class instances to showcase BigDecimal calculations var result = new BigDecimal(amount).multiply(new BigDecimal(percentage)).divide( new BigDecimal("100"), 2, BigDecimal.ROUND_HALF_EVEN); return result.toPlainString(); } var result = calculate(568000000000000000023,13.9); print(result);
打开控制台并使用以下命令。
C:\JAVA>jjs sample.js
它应该产生以下输出:
78952000000000000003.20