Java 互操作
在 Nova 中无缝调用 Java 类库
Java 互操作
NovaLang 运行在 JVM 上,可以直接调用任意 Java 类库。
导入 Java 类
import java java.util.ArrayList
import java java.io.File
import java java.time.LocalDateTime
创建对象与调用方法
val list = ArrayList<String>()
list.add("Hello")
list.add("Nova")
println(list) // [Hello, Nova]
println(list.size()) // 2
静态方法与字段
import java java.lang.System
import java java.lang.Math
val time = System.currentTimeMillis()
val pi = Math.PI
实现 Java 接口 (SAM 转换)
单抽象方法 (SAM) 接口可以直接用 Lambda 创建:
import java java.lang.Runnable
val runner = object : Runnable {
fun run() {
println("Running from Nova!")
}
}
Java 命名空间 API
除了 import java 语法,还可以通过 Java 命名空间动态访问:
// 获取类引用
val cls = Java.type("java.util.HashMap")
val map = Java.new("java.util.HashMap")
// 静态调用
val maxInt = Java.static("java.lang.Integer", "MAX_VALUE")
// 类型检查
val isStr = Java.isInstance("hello", "java.lang.String") // true
类型转换
Java 和 Nova 之间的值自动双向转换:
| Java 类型 | Nova 类型 |
|---|---|
Integer | Int |
Long | Long |
Double | Double |
Boolean | Boolean |
String | String |
List | List(递归转换) |
Map | Map(递归转换) |
null | null |
| 其他对象 | ExternalObject(可调用其 Java 方法) |
实用示例
集合操作
import java java.util.Collections
import java java.util.Arrays
val javaList = Arrays.asList("c", "a", "b")
Collections.sort(javaList)
println(javaList) // [a, b, c]
日期时间
import java java.time.LocalDateTime
import java java.time.format.DateTimeFormatter
val now = LocalDateTime.now()
val fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")
println(now.format(fmt))
文件操作
import java java.io.File
val file = File("data.txt")
if (file.exists()) {
println("文件大小: " + file.length() + " bytes")
}
安全限制
Java 互操作受沙箱策略控制:
- unrestricted:完全允许所有 Java 类
- standard:仅允许 java.util / java.math / java.time / java.lang 等安全包
- strict:完全禁止 Java 互操作