代码来源于https://github.com/hxulin/dynamic-compile-samples.git
引入编译包
<dependency> <groupId>com.itranswarp</groupId> <artifactId>compiler</artifactId> <version>1.0</version> </dependency>
添加被调用的类
package com.example.demo.dynamic; public class IndexService { public void query(){ System.out.println("query"); } }
添加测试类
package com.example.demo.dynamic; import com.itranswarp.compiler.JavaStringCompiler; import java.lang.reflect.Method; import java.util.Map; public class DynamicTest { public static final String code = "package com.example.demo.dynamic;\n" + "\n" + "public class UserService {\n" + "\n" + " private IndexService service;\n" + "\n" + " public void user(){\n" + " service.query();\n" + " }\n" + "\n" + " public void setService(IndexService service){\n" + " this.service = service;\n" + " }\n" + "\n" + "}"; public static void main(String[] args) throws Exception { JavaStringCompiler compiler = new JavaStringCompiler(); Map<String, byte[]> compile = compiler.compile("UserService.java", code); Class<?> aClass = compiler.loadClass("com.example.demo.dynamic.UserService", compile); Method setService = aClass.getMethod("setService", IndexService.class); Object o = aClass.newInstance(); setService.invoke(o,new IndexService()); Method user = aClass.getMethod("user"); user.invoke(o); } }
使用jdk自带的比较复杂,所以使用已有的编译包