HOME 首頁(yè)
SERVICE 服務(wù)產(chǎn)品
XINMEITI 新媒體代運(yùn)營(yíng)
CASE 服務(wù)案例
NEWS 熱點(diǎn)資訊
ABOUT 關(guān)于我們
CONTACT 聯(lián)系我們
創(chuàng)意嶺
讓品牌有溫度、有情感
專注品牌策劃15年

    動(dòng)態(tài)生成groovy腳本(groovy 腳本)

    發(fā)布時(shí)間:2023-05-23 01:28:35     稿源: 創(chuàng)意嶺    閱讀: 102        

    大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于動(dòng)態(tài)生成groovy腳本的問題,以下是小編對(duì)此問題的歸納整理,讓我們一起來看看吧。HpS創(chuàng)意嶺 - 安心托付、值得信賴的品牌設(shè)計(jì)、營(yíng)銷策劃公司

    開始之前先推薦一個(gè)非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報(bào)告、論文、代碼、作文、做題和對(duì)話答疑等等HpS創(chuàng)意嶺 - 安心托付、值得信賴的品牌設(shè)計(jì)、營(yíng)銷策劃公司

    只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,有小程序、在線網(wǎng)頁(yè)版、PC客戶端和批量生成器HpS創(chuàng)意嶺 - 安心托付、值得信賴的品牌設(shè)計(jì)、營(yíng)銷策劃公司

    問友Ai官網(wǎng):https://ai.de1919.com。HpS創(chuàng)意嶺 - 安心托付、值得信賴的品牌設(shè)計(jì)、營(yíng)銷策劃公司

    本文目錄:HpS創(chuàng)意嶺 - 安心托付、值得信賴的品牌設(shè)計(jì)、營(yíng)銷策劃公司

    動(dòng)態(tài)生成groovy腳本(groovy 腳本)HpS創(chuàng)意嶺 - 安心托付、值得信賴的品牌設(shè)計(jì)、營(yíng)銷策劃公司

    如何使用gradle構(gòu)建工具打包groovy腳本成jar文件HpS創(chuàng)意嶺 - 安心托付、值得信賴的品牌設(shè)計(jì)、營(yíng)銷策劃公司

    只需要編譯打包groovy腳本 所以只需要?jiǎng)?chuàng)建 src/main/groovy目錄結(jié)構(gòu)。
    例子:
    gradle_groovy_archive項(xiàng)目 結(jié)構(gòu)是:
    gradle_groovy_archive
    創(chuàng)建helloWorld.groovy腳本,代碼如下:
    package hello
    println 'Gradle compile groovy'創(chuàng)建Gradle構(gòu)建文件:
    apply plugin: 'groovy'
    apply plugin: 'maven'
    group = 'com.hello'
    archiveBaseName = 'hello'
    version = '0.1-SNAPSHOT'
    defaultTasks 'clean', 'jar'
    configurations {
    deployerJars
    }
    repositories {
    mavenCentral()
    }
    dependencies {
    //使用本地groovy環(huán)境
    groovy localGroovy()
    //groovy group: 'org.codehaus.groovy', name: 'groovy', version: '1.8.6'
    compile fileTree( dir: 'lib', include: ['*.jar'])
    deployerJars 'org.apache.maven.wagon:wagon-webdav-jackrabbit:1.0-beta-7'
    }
    sourceSets {
    main {
    groovy {
    srcDir 'src/main/groovy'
    }
    }
    }
    uploadArchives {
    repositories.mavenDeployer {
    uniqueVersion = false
    configuration = configurations.deployerJars
    repository(id : repositoryId, url : repositoryUrl) {
    authentication (userName : 'deployment', password : 'deployment')
    proxy()
    }
    }
    }創(chuàng)建構(gòu)建文件屬性文件:
    //根據(jù)不同情況修改
    repositoryId=ND
    repositoryUrl=ND
    systemProp.http.proxyHost=ND
    systemProp.http.proxyPort=8080
    systemProp.http.proxyUser=ND
    systemProp.http.proxyPassword=ND在命令行中 敲 gradle 運(yùn)行,會(huì)自動(dòng)運(yùn)行 defaultTasks,clean 和 jar,會(huì)把 所有g(shù)roovy下的腳本打成jar包。

    在java中使用groovy怎么搞HpS創(chuàng)意嶺 - 安心托付、值得信賴的品牌設(shè)計(jì)、營(yíng)銷策劃公司

    1、靜態(tài)編譯,在java工程中直接寫groovy的文件,然后可以在groovy的文件中引用java工程的類,這種方式能夠有效的利用groovy自身的語言特性,例如閉包;HpS創(chuàng)意嶺 - 安心托付、值得信賴的品牌設(shè)計(jì)、營(yíng)銷策劃公司

    2、通過groovyShell類直接執(zhí)行腳本,例如:HpS創(chuàng)意嶺 - 安心托付、值得信賴的品牌設(shè)計(jì)、營(yíng)銷策劃公司

    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);
            }
    }HpS創(chuàng)意嶺 - 安心托付、值得信賴的品牌設(shè)計(jì)、營(yíng)銷策劃公司

    3、通過groovyScriptEngine執(zhí)行文件或者腳本,例如:HpS創(chuàng)意嶺 - 安心托付、值得信賴的品牌設(shè)計(jì)、營(yíng)銷策劃公司

    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);
            }
    }HpS創(chuàng)意嶺 - 安心托付、值得信賴的品牌設(shè)計(jì)、營(yíng)銷策劃公司

    4、通過GroovyClassLoader來執(zhí)行,例如:HpS創(chuàng)意嶺 - 安心托付、值得信賴的品牌設(shè)計(jì)、營(yíng)銷策劃公司

    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));
                    }
     
            }
    }HpS創(chuàng)意嶺 - 安心托付、值得信賴的品牌設(shè)計(jì)、營(yíng)銷策劃公司

    動(dòng)態(tài)生成groovy腳本(groovy 腳本)HpS創(chuàng)意嶺 - 安心托付、值得信賴的品牌設(shè)計(jì)、營(yíng)銷策劃公司

    在java中使用groovy怎么搞HpS創(chuàng)意嶺 - 安心托付、值得信賴的品牌設(shè)計(jì)、營(yíng)銷策劃公司

    一種基于Java虛擬機(jī)的動(dòng)態(tài)語言,可以和java無縫集成,正是這個(gè)特性,很多時(shí)候把二者同時(shí)使用,把groovy作為java的有效補(bǔ)充。對(duì)于Java程序員來說,學(xué)習(xí)成本幾乎為零。同時(shí)支持DSL和其他簡(jiǎn)介的語法(例如閉包),使代碼便于閱讀??梢杂胓roovy的動(dòng)態(tài)特性來做規(guī)則引擎,在DB中維護(hù)腳本,業(yè)務(wù)變化的時(shí)候讓應(yīng)用系統(tǒng)動(dòng)態(tài)加載。
    如果引入groovy在java工程中?
    這個(gè)很簡(jiǎn)單,不需要做別的事情,僅僅把groovy的二方包加入到pom文件中即可。例如:
    <dependency>
    <groupId>org.codehaus.groovy</groupId>
    <artifactId>groovy-all</artifactId>
    <version> 1.8 . 3 </version>
    </dependency>
    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í)行的時(shí)候,都會(huì)新生成一個(gè)class文件,這樣就會(huì)導(dǎo)致JVM的perm區(qū)持續(xù)增長(zhǎng),進(jìn)而導(dǎo)致FullGCc問題,解決辦法很簡(jiǎn)單,就是腳本文件變化了之后才去創(chuàng)建文件,之前從緩存中獲取即可。
    groovy中的源碼如下:
    return parseClass(text, "script" + System.currentTimeMillis() + Math.abs(text.hashCode()) + ".groovy" );
    這個(gè)是增加緩存的代碼:
    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();
    下面這個(gè)是緩存的單例類,貼一下:
    public class GroovyScriptClassCache {
    private static final Map<String /*class文件的描述*/ ,Class<?>> GROOVY_SCRIPT_CLASS_CACHE = new HashMap<String,Class<?>>();
    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一個(gè)GroovyClassLoader,而不是所有的腳本持有一個(gè)?
    因?yàn)槿绻_本重新加載了,這時(shí)候就會(huì)有新老兩個(gè)class文件,如果通過一個(gè)classloader持有的話,這樣在GC掃描的時(shí)候,會(huì)認(rèn)為老的類還在存活,導(dǎo)致回收不掉,所以每次new一個(gè)就能解決這個(gè)問題了。
    注意CodeCache的設(shè)置大小
    對(duì)于大量使用Groovy的應(yīng)用,尤其是Groovy腳本還會(huì)經(jīng)常更新的應(yīng)用,由于這些Groovy腳本在執(zhí)行了很多次后都會(huì)被JVM編譯為native進(jìn)行優(yōu)化,會(huì)占據(jù)一些CodeCache空間,而如果這樣的腳本很多的話,可能會(huì)導(dǎo)致CodeCache被用滿,而CodeCache一旦被用滿,JVM的Compiler就會(huì)被禁用,那性能下降的就不是一點(diǎn)點(diǎn)了。
    Code Cache用滿一方面是因?yàn)榭臻g可能不夠用,另一方面是Code Cache是不會(huì)回收的,所以會(huì)累積的越來越多(其實(shí)在不采用groovy這種動(dòng)態(tài)更新/裝載class的情況下的話,是不會(huì)太多的),所以解法一可以是增大code cache的size,可通過在啟動(dòng)參數(shù)上增加-XX:ReservedCodeCacheSize=256m(Oracle JVM Team那邊也是推薦把code cache調(diào)大的),二是啟用code cache的回收機(jī)制(關(guān)于Code Cache flushing的具體策略請(qǐng)參見此文),可通過在啟動(dòng)參數(shù)上增加:-XX:+UseCodeCacheFlushing來啟用。

    以上就是關(guān)于動(dòng)態(tài)生成groovy腳本相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會(huì)為您講解更多精彩的知識(shí)和內(nèi)容。HpS創(chuàng)意嶺 - 安心托付、值得信賴的品牌設(shè)計(jì)、營(yíng)銷策劃公司


    推薦閱讀:

    新版抖音動(dòng)態(tài)去哪了(新版抖音動(dòng)態(tài)去哪了怎么刪除)

    直播間虛擬動(dòng)態(tài)背景(綠幕虛擬直播間軟件免費(fèi))

    質(zhì)量好的杭州企業(yè)宣傳片動(dòng)態(tài)(杭州品牌企業(yè))

    游戲logo圖片素材(游戲logo圖標(biāo)設(shè)計(jì))

    瓜州品牌策劃公司哪家好(瓜州品牌策劃公司哪家好一點(diǎn))