日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

groovy java_在java中使用groovy怎么搞

發(fā)布時間:2025/3/15 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 groovy java_在java中使用groovy怎么搞 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

臨摹微笑

一種基于Java虛擬機(jī)的動態(tài)語言,可以和java無縫集成,正是這個特性,很多時候把二者同時使用,把groovy作為java的有效補(bǔ)充。對于Java程序員來說,學(xué)習(xí)成本幾乎為零。同時支持DSL和其他簡介的語法(例如閉包),使代碼便于閱讀??梢杂胓roovy的動態(tài)特性來做規(guī)則引擎,在DB中維護(hù)腳本,業(yè)務(wù)變化的時候讓應(yīng)用系統(tǒng)動態(tài)加載。如果引入groovy在java工程中?這個很簡單,不需要做別的事情,僅僅把groovy的二方包加入到pom文件中即可。例如:org.codehaus.groovygroovy-all 1.8 . 3 java和groovy混合使用的方法有幾種?1、?靜態(tài)編譯?,在java工程中直接寫groovy的文件,然后可以在groovy的文件中引用java工程的類,這種方式能夠有效的利用groovy自身的語言特性,例如閉包;2、通過 groovyShell 類直接執(zhí)行腳本,例如:package groovy_dsl.shell;import groovy.lang.Binding;import groovy.lang.GroovyShell;public class GroovyShellEx {public static void main(String[] args) {Binding bind = new Binding();bind.setVariable( "name" , "iamzhongyong" );bind.setVariable( "age" , "25" );GroovyShell shell = new GroovyShell(bind);Object obj = shell.evaluate( "str = name+age;return str" );System.out.println(obj);}}3、通過 groovyScriptEngine 執(zhí)行文件或者腳本,例如:package groovy_dsl.script;import groovy.util.GroovyScriptEngine;public class ScriptEngine {public static void main(String[] args) throws Exception {GroovyScriptEngine engine = new GroovyScriptEngine( "" );Object obj = engine.run( "src/main/java/groovy_dsl/script/script_test.groovy" , "iamzhongyong" );System.out.println(obj);}}4、通過 GroovyClassLoader 來執(zhí)行,例如:package groovy_dsl.classloader;import groovy.lang.GroovyClassLoader;import groovy.lang.GroovyObject;import java.io.File;import java.io.IOException;public class GroovyClassLoaderEx {public static void main(String[] args) throws Exception, IOException {GroovyClassLoader loader = new GroovyClassLoader();for ( int i= 0 ;i< 100 ;i++){Class> clazz = loader.parseClass( new File( "src/main/java/groovy_dsl/classloader/UserDO.groovy" ));GroovyObject clazzObj = (GroovyObject)clazz.newInstance();clazzObj.invokeMethod( "setName" , "iamzhongyong" );clazzObj.invokeMethod( "setSex" , "Boy" );clazzObj.invokeMethod( "setAge" , "26" );System.out.println(clazzObj.invokeMethod( "getAllInfo" , null ));}}}使用groovy尤其需要主要的問題?通過看groovy的創(chuàng)建類的地方,就能發(fā)現(xiàn),每次執(zhí)行的時候,都會新生成一個class文件,這樣就會導(dǎo)致JVM的perm區(qū)持續(xù)增長,進(jìn)而導(dǎo)致FullGCc問題,解決辦法很簡單,就是腳本文件變化了之后才去創(chuàng)建文件,之前從緩存中獲取即可。groovy中的源碼如下:return parseClass(text, "script" + System.currentTimeMillis() + Math.abs(text.hashCode()) + ".groovy" );這個是增加緩存的代碼:GroovyClassLoader groovyClassLoader = new GroovyClassLoader(GroovyScriptExecute. class .getClassLoader());Class> groovyClass = null ;String classKey = String.valueOf(scriptClass.hashCode());//先從緩存里面去Class文件if (GroovyScriptClassCache.newInstance().containsKey(classKey)){groovyClass = GroovyScriptClassCache.newInstance().getClassByKey(classKey);} else {groovyClass = groovyClassLoader.parseClass(scriptClass);GroovyScriptClassCache.newInstance().putClass(classKey, groovyClass);}GroovyObject go = (GroovyObject)groovyClass.newInstance();下面這個是緩存的單例類,貼一下:public class GroovyScriptClassCache {private static final Map> GROOVY_SCRIPT_CLASS_CACHE = new HashMap>();private GroovyScriptClassCache(){}private static GroovyScriptClassCache instance = new GroovyScriptClassCache();public static GroovyScriptClassCache newInstance(){return instance;}public Class> getClassByKey(String key){return GROOVY_SCRIPT_CLASS_CACHE.get(key);}public void putClass(String key,Class> clazz){GROOVY_SCRIPT_CLASS_CACHE.put(key, clazz);}public boolean containsKey(String key){return GROOVY_SCRIPT_CLASS_CACHE.containsKey(key);}}為啥要每次new一個GroovyClassLoader,而不是所有的腳本持有一個?因為如果腳本重新加載了,這時候就會有新老兩個class文件,如果通過一個classloader持有的話,這樣在GC掃描的時候,會認(rèn)為老的類還在存活,導(dǎo)致回收不掉,所以每次new一個就能解決這個問題了。注意CodeCache的設(shè)置大小對于大量使用Groovy的應(yīng)用,尤其是Groovy腳本還會經(jīng)常更新的應(yīng)用,由于這些Groovy腳本在執(zhí)行了很多次后都會被JVM編譯為native進(jìn)行優(yōu)化,會占據(jù)一些CodeCache空間,而如果這樣的腳本很多的話,可能會導(dǎo)致CodeCache被用滿,而CodeCache一旦被用滿,JVM的Compiler就會被禁用,那性能下降的就不是一點點了。Code Cache用滿一方面是因為空間可能不夠用,另一方面是Code Cache是不會回收的,所以會累積的越來越多(其實在不采用groovy這種動態(tài)更新/裝載class的情況下的話,是不會太多的),所以解法一可以是增大code cache的size,可通過在啟動參數(shù)上增加-XX:ReservedCodeCacheSize=256m(Oracle JVM Team那邊也是推薦把code cache調(diào)大的),二是啟用code cache的回收機(jī)制(關(guān)于Code Cache flushing的具體策略請參見此文),可通過在啟動參數(shù)上增加:-XX:+UseCodeCacheFlushing來啟用。

總結(jié)

以上是生活随笔為你收集整理的groovy java_在java中使用groovy怎么搞的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。