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对象实例化出具体的实例对象