我已经构建了一个动态编译java源代码的应用程序,并获取已编译的类信息并存储到对象。
应用程序需要源目录和完全限定类名(例如MOCG.entity.Person)才能将文件添加到应用程序。
我在这个应用程序中使用Janino编译器。我曾经通过javax.tools.ToolProvider编译器实现,但我不知道如何编译多个文件,它不能自动编译相关的类。
现在我的代码工作得很好但是当我尝试编译接口类或抽象类时,它总是返回错误:
Caused by: org.codehaus.commons.compiler.CompileException: File /Users/chillyprig/IdeaProjects/Mockito/src/lab05/p1/dao/CourseDAO.java, Line 22, Column 9: Identifier expected in member declaration
at org.codehaus.janino.Parser.throwCompileException(Parser.java:2593)
at org.codehaus.janino.Parser.parseInterfaceBody(Parser.java:613)
at org.codehaus.janino.Parser.parseInterfaceDeclarationRest(Parser.java:518)
at org.codehaus.janino.Parser.parsePackageMemberTypeDeclaration(Parser.java:186)
at org.codehaus.janino.Parser.parseCompilationUnit(Parser.java:74)
at org.codehaus.janino.JavaSourceIClassLoader.findIClass(JavaSourceIClassLoader.java:150)
... 46 more
这是一个输入文件:
/**
* Created with IntelliJ IDEA.
* User: Dto
* Date: 12/2/12
* Time: 8:26 AM
* To change this template use File | Settings | File Templates.
*/
package lab05.p1.dao;
import java.util.List;
import java.util.Set;
/**
* This is the example of the DAO interface, you have to implement the implementation class to complete the DAO classes
* @author dto
*/
public interface CourseDAO {
/**
* Get all the courses
* @return all courses stored in the persistence
*/
List<Course> getCourses();
/**
* Get all students which enroll to the courses
* @return all students in the persistence
*/
Set<Student> getStudents();
/**
* Get the course by query the name provided
* @param name the name of the course which the user wants
* @return the course which contains the same name
* null if the course with specific name is not existed
*/
Course getCourseByName(String name);
/**
* Get the Student by id
* @param id the id of the student which we want to find
* @return the student object with the specific id
* The empty student object if the student with the specific id is not exist
*/
Student getStudentById(String id);
}
这是我剪辑的编译代码:
private Class compile() throws ClassNotFoundException, SourceDirectoryNotfoundException {
ClassLoader classLoader = null;
try{
classLoader = new JavaSourceClassLoader(
Thread.currentThread().getContextClassLoader(),
new File[] {new File(sourceDir)},
(String) null
);
} catch (NullPointerException e){
throw new SourceDirectoryNotfoundException();
}
Class<?> c = classLoader.loadClass(fullname);
return c;
}
每个建议都非常感激。任何代码示例都会很好。
答案 0 :(得分:2)
Janino是Java 1.4兼容的编译器 - 即it can't handle generics,它是在Java 5中引入的。第22行是开始List<Course>
的行 - 使用泛型,这个编译器可以处理。