整理了下以前学习时候的项目,找到一个有趣的反射示例,与大家分享下
实现效果,根据字符串动态拼接java类内容,使用反射调用其中方法
实现步骤
- 动态拼接类文件内容
- 通过文件操作生成xxx.java文件
- 编译java文件,生产.class文件
- 将.class类写如JVM中
- 获取类
- 通过反射调用方法
@Test
public void test0() throws Exception {
// 生产一个JAVA文件
String name = "Xkk";
String packageName = "com.study.spring.boot.study.ulit.kk";
String url = "F:\\localhost\\study\\src\\main\\java\\com\\study\\spring\\boot\\study\\ulit\\kk\\";
String fileName = url
+ name
+ ".java";
String rn = "\r\n";
String content = "package " + packageName + ";" + rn +
"public class " + name + " {" + rn +
" public void a(){" + rn +
" System.out.println(\"小超超,要乖乖\");" + rn +
" }" + rn +
"}" + rn;
File file = new File(fileName);
FileWriter writer = new FileWriter(file);
writer.write(content);
writer.flush();
writer.close();
//编译上面生成的文件 .Class
JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager standardJavafileManager = javaCompiler.getStandardFileManager(null, null, null);
Iterable iterable = standardJavafileManager.getJavaFileObjects(fileName);
JavaCompiler.CompilationTask task = javaCompiler.getTask(null, standardJavafileManager, null, null, null, iterable);
task.call();
standardJavafileManager.close();
//将.Class 文件装载到内存
URL[] urls = new URL[]{new URL("file:/" + url)};
URLClassLoader urlClassLoader = new URLClassLoader(urls);
Class c = urlClassLoader.loadClass(packageName + "." + name);
Object o = c.newInstance();
Method a = c.getMethod("a");
a.invoke(o);
System.out.println("结束!!");
System.out.println(c);
}
控制台输出效果.
小超超,要乖乖
结束!!
class com.study.spring.boot.study.ulit.kk.Xkk进程已结束,退出代码 0
基于本示例,可以打开脑洞,实现各种功能,