groovy的调用传值
使用 GroovyClassLoader 和 Method 对象
注:因为Groovy完全兼容java代码,所以事例的groovy脚本是以java进行编写的
public class Main {
@Test
void tesBasic() throws Exception {
String script = "class HelloWorld {\n" +
" void sayHello(String name) {\n" +
" System.out.printf(\"你好:\"+name);\n" +
" }\n" +
"}";
GroovyClassLoader classLoader = new GroovyClassLoader();
Class<?> groovyClass = classLoader.parseClass(script);
Object instance = groovyClass.getDeclaredConstructor().newInstance();
Method method = groovyClass.getMethod("sayHello", String.class);
method.invoke(instance, "Tom");
}
@Test
void TestHigh() throws Exception {
// 复杂写法
Map<String,String> map = new HashMap<>();
map.put("name","jeffery");
map.put("age","17");
Object[] params2 = new Object[2];
params2[0]=map;
params2[1] = "jeffery";
String script =
"package com.test;"+
"import java.util.Map;\n" +
"\n" +
"class TestHigh {\n" +
"\n" +
" String printMapToString(Map<String, String> paramMap,String name) {\n" +
" StringBuilder stringBuilder = new StringBuilder();\n" +
" paramMap.forEach( (key, value) ->\n" +
" stringBuilder.append(\"key:\" + key + \";value:\" + value)\n" +
" );\n" +
"stringBuilder.append(name);"+
" return stringBuilder.toString();\n" +
" }\n" +
"\n" +
"}";
GroovyClassLoader classLoader = new GroovyClassLoader();
Class<?> groovyClass = classLoader.parseClass(script);
Object instance = groovyClass.getDeclaredConstructor().newInstance();
Method method = groovyClass.getMethod("printMapToString", Map.class,String.class);
System.out.println(method.invoke(instance, params2));
// 根据类名获取实例
System.out.println("根据类名获取实例");
Object instance2 =classLoader.loadClass("com.test.TestHigh").getDeclaredConstructor().newInstance();
Method method2 = classLoader.loadClass("com.test.TestHigh").getMethod("printMapToString", Map.class,String.class);
System.out.println(method2.invoke(instance2, params2));
}
}
Basic写法
在上面的代码中,我们首先创建了一个 GroovyClassLoader 对象,并使用它加载 Groovy 脚本文件。然后,我们使用 newInstance 方法创建 Groovy 类的实例,并使用 getMethod 方法获取 Groovy 类中的方法。最后,我们使用 invoke 方法调用 Groovy 类中的方法,并传递一个参数。
High写法
基本流程同basic,只不过在high的写法中传入多个参数,且多了一个当类被类加载器加载完成后,通过类名进行加载。
浙公网安备 33010602011771号