導航:首頁 > 編程語言 > groovy調用java

groovy調用java

發布時間:2023-07-18 23:20:16

java程序員為什麼學習Groovy

首先Groovy也是運行在java虛擬機上的,二者有語法上的區別但是和java並沒有本質上的不同。
Groovy和java是相結合的關系而並不是將java取而代之。
1、Java開發者學習Groovy的成本很低
2、是一種成熟的面向對象編程語言,既可以用於面向對象編程,又可以用作純粹的腳本語言
3、完成同樣的事情Groovy可能比Java需要寫的代碼要少
4、支持單元測試和模擬(對象),可以 簡化測試
5、groovy中基本類型也是對象,可以直接調用對象的方法
......

1
2
3
4
5
6
7
8
9

def var="hello "+
"world"+
",groovy!"
def repeat(val){
for(i = 0; i < 5; i++){
println val
}
}
repeat(var)

輸出:
hello world,groovy!
hello world,groovy!
hello world,groovy!
hello world,groovy!
hello world,groovy!
最後,為什麼要學,這是給那些比較「懶」的java程序員准備的,代碼量小啊,而且一些新特性用起來也很方便省心。

㈡ java程序員為什麼使用Groovy

正如Groovy對Java很多特性進行的包裝優化一樣,基於Groovy的HttpBuilder也包裹了HttpClient,使網路編程變得更加的方便易用,下面稍微來用一個例子看一下。
尋找各種依賴的jar包有時候會讓我們失去耐心,不過值得慶幸的是我們有Maven和Gradle這樣的工具,可以根據配置輕松的幫我們配置好我們需要的數據。下面我們來敘述一下整個過程。
1. 創建文件夾httpbuildertest
2. 創建gradle配置文件,build.gradle,內容如下:
apply plugin: "groovy"
apply plugin: "eclipse"

repositories {
mavenCentral()
}

dependencies {
compile "org.codehaus.groovy:http-builder:0.4.0"
compile "org.codehaus.groovy:groovy-all:2.3.3"
testCompile "org.spockframework:spock-core:0.7-groovy-2.0"
}

gradle我們將做另文介紹
3. 執行gralde eclipse(當然必須先安裝gradle),就可以生成eclipse所需要的.classpath和.project文件,這時候就可以使用eclipse導入功能來import->Existing Projects Into WorkSpace。
4. 創建我們的一個測試,試試看是不是可以使用httpbuilder了
import groovyx.net.http.HTTPBuilder
import spock.lang.Specification;
import static groovyx.net.http.Method.*
import static groovyx.net.http.ContentType.*

class HttpbuildLabSpec extends Specification{
HTTPBuilder http = new HTTPBuilder( 'http://m.weather.com.cn' )
public void testRequestWeather(){
when:
def info =""
http.request( GET, JSON ) {
url.path = '/data/101290401.html'
headers.'User-Agent' = 'Mozilla/5.0 Ubuntu/8.10 Firefox/3.0.4'
response.success = { resp, json ->
info = json.weatherinfo.city
}
response.failure = { resp -> println "Unexpected error: ${resp.statusLine.statusCode} : ${resp.statusLine.reasonPhrase}" }
}
then: "曲靖"==info
}
}

打完收工,通過這個小例子我們可以了解到這么一些內容:
(1)HTTPBuilder 是這個框架的核心類(要不然怎麼和框架一個名字),構建這個類的對象的時候,指定要請求的baseUrl。
(2)request方法可以指定請求的method和返回的數據格式,method對應的是GET/PUT/POST/DELETE/HEAD幾個常量,而數據格式目前有JSON/XML/HTML/BINARY/URLENC/ANY幾種。
(3)一個比較有意思的地方是,在http的request方法裡面,彷彿是無根之水一樣突然冒出來了幾個沒有聲明過的變數,看起來連編譯也不會通過的方法,那麼是如何能正常運作的呢?這個我們就要研究到Groovy的Closure(閉包)。Groovy的閉包里包含有一個delegate屬性,一般來說,這個delegate里保存的是閉包使用上下文的對象引用,比如a調用了一個閉包b,則b的delegate就是a的this對象。而在HTTPBuilder對象調用request方法的時候,它把傳入閉包的delegate改成了一個叫做SendDelegate的類對象(這是HTTPBuilder的內部類,他們都是用Java寫的,在新版的HttpBuilder里,已經改名為RequestConfigDelegate),這個類裡面,分別包含了一個叫做getHeaders()的方法,一個叫做getUrL()的方法,一個叫做getResponse()的方法。稍微思索一下我們就可以想到,Groovy里有這樣的特性,如果直接使用一個識別不出來的變數,Groovy會假設它是getter的一種簡寫形式,自動進行補全(當然這也是DSL的常用伎倆,把方法偽裝成短語),而getter並沒有參數,所以其括弧是可以簡寫的,實際上上面的代碼可以寫作getUrl().path = '/data/101290401.html',這樣就非常符合程序員的視覺體驗了。
(4)主要是為了喜歡追根問題的同學釋疑,實際上整個調用還是非常的簡單明快的,在request閉包里,我們通過response(記得嗎,實際上就是GetResponse()),獲得了一個Map結構,這個Map的內部結構實際上是Map<String,Closure>,對「success」和「failure」這兩個key我們分別設置了對應的閉包,這樣就完成了回調的設置,一旦方法成功或者失敗,就可以調用到對應的閉包。
(5)使用了JSON作為返回格式,閉包的第二個參數就是解析好的返回body,就是一個Json對象,是可以直接用點號來訪問的。當然最好不要在失敗的閉包里放這個參數,一般失敗的情況比較多,也許就是一個html返回,格式錯誤那麼測試也就無法按照預期進行了。

㈢ Assert 在Java和Groovy中的區別 / 藍訊

與 Java 的區別
Groovy 試圖盡可能地讓 Java 開發者快速適應。在設計 Groovy 時,我們努力不讓用戶感到驚訝,即遵循「最小驚訝」原則,特別是針對那些此前有 Java 開發背景的 Groovy 初學者。
下面講講 Groovy 與 Java 的主要不同點。
1. 默認導入
下面這些包和類都是默認導入的,也就是說,不用再顯式地使用 import 語句了:
java.io.*
java.lang.*
java.math.BigDecimal
java.math.BigInteger
java.net.*
java.util.*
groovy.lang.*
groovy.util.*
2. 多重方法
在 Groovy 中,調用的方法將在運行時被選擇。這種機制被稱為運行時分派或多重方法(multi-methods),是根據運行時實參(argument)的類型來選擇方法。Java 採用的是相反的策略:編譯時根據聲明的類型來選擇方法。
下面的 Java 代碼可以用 Java 和 Groovy 來編譯,但兩種編譯結果截然不同:
int method(String arg) {
return 1;
}
int method(Object arg) {
return 2;
}
Object o = "Object";
int result = method(o);

用 Java 編譯的結果如下:
assertEquals(2, result);
用 Groovy 編譯的結果則為:
assertEquals(1, result);
產生差異的原因在於,Java 使用靜態數據類型,o 被聲明為 Object 對象,而 Groovy 會在運行時實際調用方法時進行選擇。因為調用的是 String 類型的對象,所以自然調用 String 版本的方法。
3. 數組初始化表達式
在 Groovy 中,{...} 語句塊是留給閉包(Closure)使用的,這意味著你不能使用以下這種格式來創建數組:
int[] array = { 1, 2, 3}
正確的方式是這樣的:
int[] array = [1,2,3]
4. 包范圍可見性
在 Groovy 中,如果某個欄位缺失了修飾符,並不會導致像在 Java 中那樣形成包的私有欄位:
class Person {
String name
}

相反,它會用來創建一個屬性(property),也就是一個私有欄位(private field),以及一個關聯的 getter 和一個關聯的 setter。
在 Groovy 中創建包私有欄位,可以通過標注 @PackageScope 來實現。
class Person {
@PackageScope String name
}

5. ARM 語句塊
ARM(Automatic Resource Management,自動資源管理)語句塊從 Java 7 開始引入,但 Groovy 並不支持。相反,Groovy 提供多種基於閉包的方法,效果相同但卻合乎習慣。例如:
Path file = Paths.get("/path/to/file");
Charset charset = Charset.forName("UTF-8");
try (BufferedReader reader = Files.newBufferedReader(file, charset)) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}

} catch (IOException e) {
e.printStackTrace();
}

可以寫成下面這樣的代碼:
new File('/path/to/file').eachLine('UTF-8') {
println it
}

或者,如果你想讓它更接近於 Java 的慣用形式,可以這樣寫:
new File('/path/to/file').withReader('UTF-8') { reader ->
reader.eachLine {
println it
}
}

㈣ Java序列化問題和Groovy在Java中使用的問題

proxy對象是不能序列化的,就算能序列化也不能反序列化,因為proxy對象的類是動態生成出來的,序列化後,反序列化時目標jVM肯定沒有載入過這個代理類。
有個變通的方法,就是獲取到對象本身,序列化;反序列化後獲取到原對象,再重新用代理包裝即可獲得反序列化後的代理對象了。不知道是否貼題。下面有個例子,雖然沒有序列化和反序列化,但是基本實現了獲取對象本身這個功能,希望能幫到你。

另外groovy對象也是java對象,應該仍然保持groovy對象本身(個人理解,groovy我也是略懂皮毛),spring應該不會對對象本身動刀子,最多加層代理啥的。
//-------------------------------------------------------------------------------
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Test implements TestInterface{
public static void main(String[] args) {
final Test t = new Test();
TestInterface t2 = (TestInterface) Proxy.newProxyInstance(
Test.class.getClassLoader(),
Test.class.getInterfaces(),
new InvocationHandler() {

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
try {
return method.invoke(t, args);
} catch(InvocationTargetException ite) {
throw ite.getTargetException();
}
}
}
);
t2.test();
//使用這種方式獲取原對象,序列化原對象後,反序列化原對象 重新構造代理
System.out.println(t2.getThis().getClass());
System.out.println(t2.getClass());

}

public void test() {
System.out.println(1);

}
public Test getThis() {
return this;
}
}

interface TestInterface{
public void test() ;
public Test getThis() ;
}

㈤ groovy中使java必須import嗎

第一種是調用groovy官方庫里的類

第二種是調用自己寫的groovy文本的類

缺點: 如果不安裝groovy解釋器和groovy Eclipse插件.就無法享受更多的對jdk 類的擴展, 已經腳本化語法的便捷.

腳本語言特點 無main,直接printf

第二步: jar依賴,maven庫上傳.

第三步: 推廣成員安裝groovy解釋器和groovy Eclipse插件

1. 第一種. 如果用maven的話

在pom的 依賴項里加入.

<groupId>org.codehaus.groovy</groupId>

<artifactId>groovy-all</artifactId>
<version>2.2.2</version>

</dependency>

或者去官網下載grovvy的jar包,導入的eclipse的class依賴中.

就可以直接在java里調用 grovvy庫里的類了.

( 如果Eclipse不會自動 import groovy的類,需要在.project中新增 <nature>org.eclipse.jdt.groovy.core.groovyNature</nature>)

import groovy.util.GroovyCollections;
import java.util.List;
public static void main(String[] args) {
List<Double> lists = new ArrayList<Double>();
lists.add(0.2);
lists.add(0.3);
lists.add(0.2);

Object sum = GroovyCollections.sum(lists);
System.out.println(sum);
}

====

2 第二種. 如果是自己寫的groovy 文件.

假如如下 GrovvySystemConfigRead.groovy代碼

[java]view plain

閱讀全文

與groovy調用java相關的資料

熱點內容
java互聯網公司 瀏覽:70
對弈下象棋的app哪裡好 瀏覽:707
有什麼食譜app推薦 瀏覽:471
python實現動態口令 瀏覽:825
我的世界電腦伺服器地址怎麼添加 瀏覽:850
傳奇地圖怎麼加密到pak 瀏覽:977
linux刪除mysql用戶 瀏覽:755
圖案設計pdf 瀏覽:584
pdf編輯器在線 瀏覽:471
華為雲雲耀伺服器如何關機 瀏覽:994
數字加密的歷史 瀏覽:613
宏傑文件夾打不開 瀏覽:819
施工日記app哪個好 瀏覽:566
什麼是壓縮機的排氣量 瀏覽:538
在哪個app可以預約一科考試 瀏覽:634
易語言vmp加殼源碼 瀏覽:513
閱讀前端框架源碼 瀏覽:14
我的世界命令方塊傳送指令 瀏覽:545
不能用start命令打開xp 瀏覽:926
text命令 瀏覽:31