我想使用反射来获取新创建的java类的所有方法。像下面我通过从另一个文件复制创建了Java类,然后我使用JavaCompiler来编译新创建的Java。但我不知道为什么没有创建目标类文件。 PS:如果我给出了错误的源目标java文件路径,那么会有像"javac: cannot find file: codeGenerator/Service.java"
这样的编译信息。谢谢大家。
private static Method[] createClassAndGetMethods(String sourceFilePath) throws IOException {
File targetFile = new File("Service.java");
File sourceFile = new File(sourceFilePath);
Files.copy(sourceFile, targetFile);
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
compiler.run(null, null, null, targetFile);
Thread.sleep(5000);
//After the Service.java compiled, use the class getDeclaredMethods() method.
Method[] declaredMethods = Service.class.getDeclaredMethods();
return declaredMethods;
}
编译方法:
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
compiler.run(null, null, null, targetFile);
答案 0 :(得分:1)
Method[] declaredMethods = Service.class.getDeclaredMethods();
除非Service.class
已编译,否则您无法编写直接依赖Service
的代码。您必须动态加载类并从那里获取方法。目前很难看出包含此代码的类如何加载,并且肯定不会给出正确的答案,除非版本的Service.class
存在于该类加载,在这种情况下,您的代码将提供 版本的方法,而不是新编译的版本。
您需要从整个源代码中删除对Service.class
或Service
的所有引用,并在编译后使用Service
加载Class.forName()
。执行干净的构建以确保部署中不存在Service.class
文件。
答案 1 :(得分:0)
public static void compile(String sourceFilePath, String classPath) throws IOException {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
Iterable sourcefiles = fileManager.getJavaFileObjects(sourceFilePath);
Iterable<String> options = Arrays.asList("-d", classPath);
compiler.getTask(null, fileManager, null, options, null, sourcefiles).call();
fileManager.close();
}
最后,我以上述方式成功编译了目标Service.java。谢谢大家。