groovy系列一 groovy编译脚本为class对象

整体思路:

  1. 获取GroovyClassLoader加载器, 根据需要可能指定父类加载器
  2. 编译脚本
    直接上个工具类
import groovy.lang.GroovyClassLoader;

/**
 * groovy 编译器
 */
public class GroovyCompiler {

    /**
     * 获取脚本的class
     * @param script
     * @return
     */
    public static Class<?> compile(String script) {
        GroovyClassLoader loader = getDefaultParentGroovyClassLoader();
        Class<?> groovyClass = loader.parseClass(script);
        return groovyClass;
    }

    /**
     * 获取脚本的class对象
     * @param script  groovy 脚本
     * @param className 类名字
     */
    public static Class<?> compile(String script, String className) {
        GroovyClassLoader loader = getDefaultParentGroovyClassLoader();
        Class<?> groovyClass = loader.parseClass(script, className);
        return groovyClass;
    }

    /**
     * 默认的父加载器为GroovyCompiler().getClass().getClassLoader()
     * @return  返回groovy的类加载器
     */
    public static GroovyClassLoader getDefaultParentGroovyClassLoader() {
        ClassLoader cl = new GroovyCompiler().getClass().getClassLoader();
        return new GroovyClassLoader(cl);
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Groovy是一种基于Java平台的动态编程语言,它提供了许多方便的特性,例如闭包、动态类型、元编程等。在Java应用程序中,我们可以通过将Groovy脚本嵌入到Java代码中来实现更灵活的编程。具体来说,可以使用GroovyShell类来加载和执行Groovy脚本,也可以使用GroovyClassLoader类来动态加载Groovy类。 在使用Groovy脚本嵌入开发时,需要先编写Groovy脚本并保存为.groovy文件,然后在Java代码中加载并执行该脚本。例如,以下代码演示了如何加载并执行一个简单的Groovy脚本: ```java import groovy.lang.Binding; import groovy.lang.GroovyShell; public class GroovyScriptRunner { public static void main(String[] args) throws Exception { Binding binding = new Binding(); binding.setVariable("name", "World"); GroovyShell shell = new GroovyShell(binding); shell.evaluate(new File("hello.groovy")); } } ``` 在这个例子中,我们首先创建了一个GroovyShell对象,并将一个Binding对象传递给它。Binding对象可以用于在Java代码和Groovy脚本之间共享变量。然后,我们通过调用GroovyShell的evaluate方法加载并执行了一个名为hello.groovy脚本文件。 当我们需要在Java应用程序中动态生成类时,也可以使用Groovy脚本来实现。Groovy提供了一个方便的@CompileStatic注解,可以使得Groovy类在编译时就能够被静态化,并且可以直接在Java代码中使用。以下是一个使用@CompileStatic注解的例子: ```groovy import groovy.transform.CompileStatic @CompileStatic class MyGroovyClass { static int add(int x, int y) { return x + y } } ``` 在Java代码中,我们可以直接使用该Groovy类: ```java import org.codehaus.groovy.control.CompilerConfiguration; import groovy.lang.GroovyClassLoader; public class GroovyClassGenerator { public static void main(String[] args) throws Exception { CompilerConfiguration config = new CompilerConfiguration(); config.setTargetDirectory("target/classes"); GroovyClassLoader loader = new GroovyClassLoader( GroovyClassGenerator.class.getClassLoader(), config); Class<?> clazz = loader.parseClass(new File("MyGroovyClass.groovy")); int result = (int) clazz.getDeclaredMethod("add", int.class, int.class) .invoke(null, 1, 2); System.out.println(result); } } ``` 在这个例子中,我们使用GroovyClassLoader的parseClass方法动态加载了MyGroovyClass.groovy文件,并使用反射方式调用了其中的add方法。在这个过程中,MyGroovyClass类已经被编译成了Java字节码文件,并被保存在了指定的目录中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值