[TOC]
# 1. Java 平台的脚本机制
|技术边界|Java支持脚本语言调用Java类或方法,将Java嵌入到脚本语言中使用|
|:-:|:-|
|特性|扩展性:可以自定义脚本语言<br>简单易用:脚本语言简单易学<br>动态性:可以动态调用Java方法<br>交互性:可以在脚本语言的REPL中调用Java|
|使用场景|需要提供自定义的DSL或命令<br>需要简单易用的开发环境<br>需要动态调用或交互<br>需要嵌入到其它语言或应用中|
|应用方法|实现ScriptEngine和ScriptEngineFactory<br>设计脚本语言的语法<br>读取和执行脚本程序<br>在脚本中调用Java类或方法|
> ## Java脚本机制与项目中的结构关系:
|项目结构|脚本机制接口|
|:-:|:-|
|Java源码|.java文件:包含ScriptEngine及其工厂的实现|<br>Java类和方法:供脚本调用|
|编译生成|.class文件:编译Java源码生成|<br>无其他生成物|
|项目部署|.class文件:部署Java类|<br>脚本文件(可选):部署脚本源文件|
> ## Java脚本机制实现关键流程:
|流程|描述|
|:-:|:-|
|实现ScriptEngine|实现脚本引擎,可定义语法、执行脚本等|
|实现ScriptEngineFactory|工厂类,用于创建和管理ScriptEngine实例|
|设计脚本语言语法(可选)|自定义脚本语言的语法、结构等(可选)|
|读取和执行脚本|通过ScriptEngine读取和执行脚本程序|
|在脚本中调用Java|在脚本中调用Java提供的类或方法|
|提供交互式SHELL(可选)|提供一个读取-执行-打印循环的交互界面(可选)|
> ## 总结:
Java的脚本机制允许自定义脚本语言,并在脚本中调用Java类或方法。其关键是实现ScriptEngine和ScriptEngineFactory,设计语言语法(可选),并在脚本中调用Java。脚本机制可以扩展语言,提供简单的开发环境,实现动态或交互调用,被嵌入到其它语言或应用中使用。
# 2. 示例
这里是一个使用Java脚本机制的示例,包含一个简单的脚本引擎和交互式SHELL:
ScriptEngine实现:
```
java
public class SimpleScriptEngine extends AbstractScriptEngine {
// 执行脚本源码
@Override
public Object eval(String source, ScriptContext context) {
// 简单的语法:每行是一个表达式
String[] lines = source.split("\n");
for (String line : lines) {
// 计算每行表达式并打印结果
Object result = calc(line);
context.getWriter().println(result);
}
return null;
}
// 简单的表达式计算器
private Object calc(String expr) {
// 使用ScriptEngine作为上下文调用Java方法
ScriptEngine engine = this;
return engine.eval(expr);
}
}
```
> ## ScriptEngineFactory实现:
```
java
public class SimpleScriptEngineFactory implements ScriptEngineFactory {
// 返回SimpleScriptEngine实例
@Override
public ScriptEngine getScriptEngine() {
return new SimpleScriptEngine();
}
@Override
public String getEngineName() {
return "Simple";
}
// ... 省略其它实现 ...
}
```
> ## 交互式SHELL:
```
java
public class SimpleShell {
public static void main(String[] args) {
// 获取ScriptEngine
ScriptEngine engine = new SimpleScriptEngineFactory().getScriptEngine();
// 读取-执行-打印循环
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.print(">>> ");
String line = scanner.nextLine();
if ("exit".equals(line)) {
break;
}
engine.eval(line);
}
}
}
```
> ## 执行SimpleShell,在其中调用SimpleScriptEngine执行脚本:
```
>>> 1 + 2
3
>>> Math.random()
0.123
>>> exit
```
> ## 注释:
- 实现ScriptEngine和ScriptEngineFactory
- 设计简单的脚本语法,每行是一个表达式
- 在eval方法中执行脚本,并在脚本中调用Java方法
- 提供一个交互式SHELL,读取-执行-打印循环
- 执行脚本并调用Java方法,实现动态交互
这个示例演示了使用Java脚本机制定制脚本语言并提供交互式SHELL的过程。通过实现ScriptEngine和ScriptEngineFactory,可以自定义语言结构,并在脚本中调用Java方法。
- 系统设计
- 需求分析
- 概要设计
- 详细设计
- 逻辑模型设计
- 物理模型设计
- 产品设计
- 数据驱动产品设计
- 首页
- 逻辑理解
- 微服务架构的关系数据库优化
- Java基础架构
- 编程范式
- 面向对象编程【模拟现实】
- 泛型编程【参数化】
- 函数式编程
- 响应式编程【异步流】
- 并发编程【多线程】
- 面向切面编程【代码复用解耦】
- 声明式编程【注解和配置】
- 函数响应式编程
- 语法基础
- 包、接口、类、对象和切面案例代码
- Springboot按以下步骤面向切面设计程序
- 关键词
- 内部类、匿名类
- 数组、字符串、I/O
- 常用API
- 并发包
- XML
- Maven 包管理
- Pom.xml
- 技术框架
- SpringBoot
- 项目文件目录
- Vue
- Vue项目文件目录
- 远程组件
- 敏捷开发前端应用
- Pinia Store
- Vite
- Composition API
- uniapp
- 本地方法JNI
- 脚本机制
- 编译器API
- 注释
- 源码级注释
- Javadoc
- 安全
- Swing和图形化编程
- 国际化
- 精实或精益
- 精实软件数据库设计
- 精实的原理与方法
- 项目
- 零售软件
- 扩展
- 1001_docker 示例
- 1002_Docker 常用命令
- 1003_微服务
- 1004_微服务数据模型范式
- 1005_数据模型
- 1006_springCloud
- AI 流程图生成
- Wordpress_6
- Woocommerce_7
- WooCommerce常用的API和帮助函数
- WooCommerce的钩子和过滤器
- REST API
- 数据库API
- 模板系统
- 数据模型
- 1.Woo主题开发流程
- Filter
- Hook
- 可视编辑区域的函数工具
- 渲染字段函数
- 类库和框架
- TDD 通过测试来驱动开发
- 编程范式对WordPress开发
- WordPress和WooCommerce的核心代码类库组成
- 数据库修改
- 1.WP主题开发流程与时间规划
- moho
- Note 1
- 基础命令