2013-05-20 63 views
3

我已经构建了一个动态编译java源代码的应用程序,并获取已编译的类信息并存储到对象中。Janino动态编译接口类

应用程序需要源目录和完全限定类名(例如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; 
    } 

每个建议都非常感谢。任何代码示例都会很好。

回答

2

Janino是Java 1.4兼容编译器 - 即it can't handle generics,它们是在Java 5中引入的。第22行是开始List<Course>的行 - 该编译器无法处理的泛型的使用。

+0

什么是替代选项来支持泛型? – csk