文档/进阶/Java 互操作

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 类型
IntegerInt
LongLong
DoubleDouble
BooleanBoolean
StringString
ListList(递归转换)
MapMap(递归转换)
nullnull
其他对象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 互操作