如何插件化地将Groovy文件加载进内存

Groovy文件如何加载到内存中

1、引入 groovy-all 依赖
<dependencies>
    <dependency>
        <groupId>org.codehaus.groovy</groupId>
        <artifactId>groovy-all</artifactId>
        <version>2.4.15</version>
    </dependency>
</dependencies>
2、定义接口

为了方便测试,我们使用了一个接口进行模拟,实际情况可以直接使用一个普通的定义一个普通的方法进行测试

package com.richard.demo.groovy;

public interface DemoService {

    void doSomething();
}
3、定义groovy 文件,实现上面定义的接口
package com.richard.demo.groovy

class DemoServiceImpl implements DemoService {

    /**
     * 逻辑处理,方便测试打印 hello world
     */
    @Override
    void doSomething() {
        System.out.println("hello world!")
    }
}
4、GroovyClassLoader的使用

首先需要初始化一个GroovyClassLoader

为这个groovy文件提供相应的配置 CompilerConfiguration

核心方法 parseClass

1、参数:serviceContent为groovy文件的内容

获取到class对象,直接通过newInstance进行创建对象,将对象强制转换为 接口的类型,以获取接口实现类的对象

最后直接通过创建的对象进行调用

package com.richard.demo.groovy;


import groovy.lang.GroovyClassLoader;
import org.codehaus.groovy.control.CompilerConfiguration;

public class GroovyTest {

    public static void main(String[] args) {
        // 配置 CompilerConfiguration
        CompilerConfiguration config = new CompilerConfiguration();
        config.setSourceEncoding("UTF-8");
        // 创建类加载器
        GroovyClassLoader groovyClassLoader = new GroovyClassLoader(Thread.currentThread().getContextClassLoader(), config);
        String serviceContent = "package com.richard.demo.groovy\n" +
                "\n" +
                "class DemoServiceImpl implements DemoService {\n" +
                "\n" +
                "\n" +
                "    @Override\n" +
                "    void doSomething() {\n" +
                "        System.out.println(\"hello world!\")\n" +
                "    }\n" +
                "}\n";
        Class<?> aClass = groovyClassLoader.parseClass(serviceContent);
        try {
            // 获取到class对象,直接通过newInstance进行创建对象,将对象强制转换为 接口的类型,以获取接口实现类的对象最后直接通过创建的对象进行调用
            DemoService demoService = (DemoService) aClass.newInstance();
            demoService.doSomething();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

注意:parseClass并没有将类的信息加载到内存中,只是将类的定义转化成了 class 对象,通过class对象实例化出具体的实例对象

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值