天天看點

Java混合程式設計調用Java在java中調用Clojure在java中調用Kotlin

JVM中運作的各種語言底層互通,先天上就具備混合程式設計的優勢。

文章目錄

  • 調用Java
  • 在java中調用Clojure
  • 在java中調用Kotlin

調用Java

Java在JVM中的老大地位不可撼動,是以諸如Groovy,Kotlin,Scala,Clojure等都可以無痛調用。

比如在Groovy中:

C:\Users\Laser>groovysh
九月 12, 2019 6:28:42 下午 java.util.prefs.WindowsPreferences <init>
Type ':help' or ':h' for help.
groovy:000> import java.util.*
===> java.util.*
groovy:000> rand = new Random()
===> java.util.Random@34997338
groovy:000> rand.nextInt(100)
===> 9
groovy:000> rand.nextInt(100)
===> 36
groovy:000>
           

在Kotlin中:

C:\Users\Laser>kotlinc-jvm
Welcome to Kotlin version 1.3.50 (JRE 1.8.0_144-b01)
Type :help for help, :quit for quit
>>> import java.util.*
>>> var rand = Random()
var rand = Random()>>> rand.nextInt(100)
rand.nextInt(100)res5: kotlin.Int = 90
           

在scala中:

C:\Users\Laser>scala
Welcome to Scala 2.13.0 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_144).
Type in expressions for evaluation. Or try :help.
scala> import java.util
scala> val rand = new util.Random()
rand: java.util.Random = java.util.Random@530ee28b
scala> rand.nextInt(100)
res0: Int = 59
           

Clojure這個Lisp方言有點特立獨行,畢竟不是面向對象語言,本身就與java水土不服,但也可以調用

C:\Users\Laser>lein repl
user=> (def randn (java.util.Random.))
#'user/randn
user=> (.nextInt randn 100)
88
user=>
           

對于其他java中方法的調用,也需要改成Clojure形式,列入下表,注意Clojure中的

.

和空格。

操作 Java Clojure
建立類的執行個體 ClassName obj = new ClassName(args) (def obj (ClassName. args)
調用執行個體方法 obj.methodName(args) (.methodName obj args)
調用靜态方法 ClassName.methodName(args) (ClassName/methodName args)
通路靜态屬性 ClassName.field ClassName/field
通路執行個體的屬性 obj.field (.field obj)
修改執行個體的屬性 obj.field = value (set! (.field obj) value)
引用Class ClassName.class ClassName

在java中調用Clojure

首先建立一個Clojure工程,

E:\Documents\00\0913>lein new hello
E:\Documents\00\0913>tree /f hello
卷 工作 的檔案夾 PATH 清單
卷序列号為 3895-5CDD
E:\DOCUMENTS\00\0913\HELLO
│  .gitignore
│  .hgignore
│  CHANGELOG.md
│  LICENSE
│  project.clj		//配置檔案
│  README.md
├─doc
│      intro.md
├─resources
├─src
│  └─hello
│          core.clj		//源代碼
└─test
    └─hello
            core_test.clj	//測試代碼
E:\Documents\00\0913>code hello
           

其中,

src\hello\core.clj

即建立項目的Clojure代碼,預設為:

(ns hello.core)
(defn foo
  "I don't do a whole lot."
  [x]
  (println x "Hello, World!"))
           

由于我們需要在java中調用,是以需要添加java的基礎結構——類,是以對代碼稍加修改:

(ns hello.core
  (:gen-class		;;建立類
    :methods [#^{:static true} [foo [String] String]]));;類中有一個傳入str輸出str的方法foo

(defn foo
  "I don't do a whole lot."
  [x]
  (println x "Hello, World!")
  (str "hello" x))

(defn -main [] (println "this is main"))
           

在項目目錄中,project.clj為工程配置檔案,将其改為

(defproject hello "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :dependencies [[org.clojure/clojure "1.10.0"]]
  :aot [hello.core]	;;預編譯
  :main hello.core)	;;設定入口函數
           

然後回到hello目錄下,進行編譯和打包,得到兩個jar包,即可進行調用了。也可以通過

java -jar

對執行,可見執行了

main

函數。

E:\Documents\00\0913\hello>lein compile
Compiling hello.core
E:\Documents\00\0913\hello>lein uberjar
Compiling hello.core
Compiling hello.core
Created E:\Documents\00\0913\hello\target\hello-0.1.0-SNAPSHOT.jar
Created E:\Documents\00\0913\hello\target\hello-0.1.0-SNAPSHOT-standalone.jar
E:\Documents\00\0913\hello>java -jar target\hello-0.1.0-SNAPSHOT-standalone.jar
this is main
           

在java中調用Kotlin