加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Learning Groovy

发布时间:2020-12-14 16:50:31 所属栏目:大数据 来源:网络整理
导读:最近,了解一下规则引擎,似乎名气比较大的规则引擎不多,也就是 JBoss的Drools 和 Apache 的Camel?。相对于其它品类的开源软件来说,规则引擎似乎不是很旺盛。 在了解Activiti 的时候,可以使用Groovy写一些规则,因此了解了一下Groovy。 Groovy?是一种用于

最近,了解一下规则引擎,似乎名气比较大的规则引擎不多,也就是 JBoss的Drools 和 Apache 的Camel?。相对于其它品类的开源软件来说,规则引擎似乎不是很旺盛。

在了解Activiti 的时候,可以使用Groovy写一些规则,因此了解了一下Groovy。

Groovy?是一种用于 Java 虚拟机的 动态语言,它是面向对象的,既可以面向对象编程,也可以用作脚本语言。它可以和Java互相调用。

下面是一个简单的规则实现,使用java实现具体行为,Groovy实现判断逻辑。

Java 行为部分

Java 接口

public interface Fruit{
    public String getName();
    public String Type();
    public void show();
}

对以上接口的2个实现类

public class Apple implements Fruit{
    public String getName(){
        return "java apple";
    }
    public String getType(){
        return "apple";
    }
    public void show(){
        System.out.println("Show: I am a Java Apple");
    }
}

public class Orange implements Fruit {

    public String getName(){
        return "java orange";
    }
    public String getType(){
        return "orange";
    }
    
    public void show(){
        System.out.println("Show: I am a java orange.");
    }
}

下面是Groovy部分。

1 、Groovy 实现java接口的方式:

用于Groovy的Java 接口

public interface GroovyController {

    public void controllFruit(Fruit fruit);
}

Groovy 的实现,另存为文件(GroovyClass.groovy),文件扩展名为 .groovy??

import java.lang.String;

class GroovyClass implements GroovyController{
     
     public void controllFruit(Fruit fruit){
        fruit.show()
        if (fruit.getType() == "apple"){
            println 'groovy apple'
        }
        if (fruit.getType() == "orange"){
            println 'groovy orange';
        }
        println 'END'
     }
}

Java load Groovy 文件,实例化 Groovy的对象,并运行

代码片段 ,groovy文件存于D盘根下。

public static void testGroovyClass(){
        ClassLoader loader = new GroovyManager().getClass().getClassLoader();
        GroovyClassLoader gLoader = new GroovyClassLoader(loader);

        Fruit apple = new Apple();
        Fruit orange = new Orange();
            try {
                Class groovyClass = gLoader.parseClass(
                        new File("D:/GroovyClassDisk.groovy"));
                GroovyController controller = (GroovyController)groovyClass.newInstance();
                controller.controllFruit(apple);

                controller.controllFruit(orange);
                
                System.out.println("run groovy class end");
                
                System.out.println("another way to run groovy class with directly invoking method ");
                
                GroovyObject gobject = (GroovyObject)groovyClass.newInstance();
                gobject.invokeMethod("controllFruit",apple);
                gobject.invokeMethod("controllFruit",orange);
                System.out.println("end to running groovy class ");
            } catch (CompilationFailedException e) {

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

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

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

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

                e.printStackTrace();
            }
    }

结果:

Show: I am a java apple.
disk groovy apple
END
Show: I am a java orange.
disk groovy orange
END
run groovy class end
another way to run groovy class with directly invoking method 
Show: I am a java apple.
disk groovy apple
END
Show: I am a java orange.
disk groovy orange
END
end to running groovy class 

2、Groovy Script的方式

Groovy Script:

fruit.show()
if (fruit.getType() == "apple"){
    println 'script groovy apple'
}
if (fruit.getType() == "orange"){
    println 'script groovy orange'
}
println 'END'

Java load Groovy script and run

public static void testGroovyScript(){
        Fruit apple = new Apple();
        Fruit orange = new Orange();
        String scriptText = null;
        try {
            scriptText = FileUtils.readFileToString(new File("d:/GroovyScript.groovy"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        // Using Script engine
        ScriptEngineManager manager = new ScriptEngineManager(GroovyManager.class.getClassLoader());
        ScriptEngine scriptEng = manager.getEngineByName("Groovy");
        try {
            scriptEng.put("fruit",apple);
            scriptEng.eval(scriptText);
            
            scriptEng.put("fruit",orange);
            scriptEng.eval(scriptText);
        } catch (ScriptException e) {
            e.printStackTrace();
        }
        System.out.println("ending using Script engine");
        
        System.out.println("Begin to use Groovy bind");
        Binding bind = new Binding();
        GroovyShell gs = new GroovyShell(bind);
        bind.setProperty("fruit",apple);
        gs.evaluate(scriptText);
        
        bind.setProperty("fruit",orange);
        gs.evaluate(scriptText);
        
        System.out.println("end to use Groovy bind");
    }

结果:

Show: I am a java apple.
script groovy apple
END
Show: I am a java orange.
script groovy orange
END
ending using Script engine
Begin to use Groovy bind
Show: I am a java apple.
script groovy apple
END
Show: I am a java orange.
script groovy orange
END
end to use Groovy bind

以上为简单的例子。似乎可以实现规则引擎的一些功能。而且 Groovy也不难用。上面例子中的文件都没有路径,如果加上路径的话,

Groovy的编写使用跟java相同的import,要让groovy代码中能够找到java类的路。在此记录一下。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读