使用javax.tool进行Cascade内存编译

Eclipse的JDT编译器提供了一个接口INameEnvironment,它定义了方法findType(…),使您能够进行级联编译.好奇地,我想知道是否有办法使用标准的JDK编译器工具包?

请注意,该方案是一个模板引擎,用于内存编译,用于具有相互依赖关系的模板文件生成的类,并且它不能预测您遇到的模板文件的顺序,因此Foo可能需要先编译,然后才能编译它的父栏因此,您需要一个机制来执行级联编译,这意味着在编译Foo期间,您需要生成一个代码栏并首先编译它以继续Foo的编译:一些代码如下所示:

private NameEnvironmentAnswer findType(final String name) {
    try {
        if (!name.contains(TemplateClass.CN_SUFFIX)) {
            return findStandType(name);
        }

        char[] fileName = name.tochararray();
        TemplateClass templateClass = classCache.getByClassName(name);

        // TemplateClass exists
        if (templateClass != null) {

            if (templateClass.javaByteCode != null) {
                ClassFileReader classFileReader = new ClassFileReader(templateClass.javaByteCode,fileName,true);
                return new NameEnvironmentAnswer(classFileReader,null);
            }
            // Cascade compilation
            Icompilationunit compilationunit = new compilationunit(name);
            return new NameEnvironmentAnswer(compilationunit,null);
        }

        // So it's a standard class
        return findStandType(name);
    } catch (ClassFormatException e) {
        // Something very very bad
        throw new RuntimeException(e);
    }
}

解决方法

基于我们的评论对话,我认为答案是清楚的:不,你不能用JDK编译器来做.当它请求包时,它会给你一个钩子,而不是特定的类依赖.

关于尽可能靠近,我知道的是:

Here’s a nice article代码,虽然它需要适应处理内存类.具体来说,您所描述的问题由JavaFileManager.list(…)方法处理.您必须在这里返回您已在内存中缓存的JavaFileObjects.您很可能需要创建一个ForwardingJavaFileManager的子类,如本文所述 – 尽管通过修改来处理您正在使用的缓存类.

你可以用它来编写一些东西.如果它返回错误,请使用正则表达式来查找丢失的内容.在为缺少的东西生成/编译代码之后,重试编译原始代码.

注意:它在某些时候要求依赖类的FQN作为ForwardingFileManager.list(…)中的packageName参数.那时我没有试图返回班级.它可能不起作用,因为包将不匹配,但也许会这样.

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...