2016-05-10 10 views
2

Я хочу использовать отражение, чтобы получить все методы только что созданного класса Java. Как и я, я создал класс java, скопировав его из другого файла, затем я использую JavaCompiler для компиляции вновь созданной Java. Но я не знаю, почему файл целевого класса не был создан. PS: Если я задаю неправильный путь к файлу java-файла, будет компилироваться информация, подобная "javac: cannot find file: codeGenerator/Service.java". Спасибо вам всем.JavaCompiler на самом деле не компилировал класс

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); 

ответ

1
Method[] declaredMethods = Service.class.getDeclaredMethods(); 

Вы не можете написать код, который напрямую зависит от Service.class если Service не уже составлен. Вам придется динамически загружать класс и получать оттуда методы. В настоящее время трудно понять, как класс, содержащий этот код, будет даже загружаться, и он, конечно же, не даст правильного ответа , если только не присутствовала, когда класс был загружен, и в этом случае ваш код даст методы , что версия, а не только что скомпилированная версия.

Вы должны избавиться от всех ссылок на Service.class или действительно Service от всего исходного кода и нагрузок Service с Class.forName() после компиляции. Сделайте чистую сборку, чтобы в вашем развертывании не было файла Service.class.

+0

'Метод [] объявленMethods = Class.forName (" codeGenerator.Service "). GetDeclaredMethods();' Если я использую его таким образом, я все равно не могу получить правильный вывод. Дело в том, что класс не был составлен. – leo

+1

@EJP Четкий ответ действительно должен быть одобрен. –

+0

@leo См. Здесь [здесь] (http://stackoverflow.com/questions/7989135/is-it-possible-to-programmatically-compile-java-source-code-in-memory-only). – EJP

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 выше. Спасибо вам всем.