zoukankan      html  css  js  c++  java
  • 代码生成器,想想看

    搞web服务器端的被三层害死了,整天调来调去的,写的一样的代码,什么时候才能简单点。

    从前有codesmith的日子,很和谐, 很幸福,选个数据源,点个执行,刷的代码就出来了,爽歪歪啊。

    codesmith支持.net,用的c#语法,能导出cs文件,靠,什么时候能导下java文件,不过总算能导出txt文件,弥补下。

    最重要的是要等crack……

    自从公司无聊的奶茶项目完结了,还没写过什么东西,不想搞虚的,什么web网站,什么blog,太飘渺,网上一大把。

    还是写个代码生成器实用。

    于是,收集资料,看了freemaker的代码,我被NPE深深地打败了,要是少初始化个变量,日志直接打爆。

    还是回归我比较熟悉的velocity,看了下源码,首先想到的是把template作为切入点,如果template能直接取到绝对路径的话,那么就不用考虑很多的文件读取方式了。

    看了下代码:

    protected Resource loadResource(String resourceName, int resourceType, String encoding)
            throws ResourceNotFoundException,
                ParseErrorException,
                Exception
        {
            Resource resource = createResource(resourceName, resourceType);
            resource.setRuntimeServices(rsvc);
            resource.setName(resourceName);
            resource.setEncoding(encoding);
    
        //…………
    
            for (Iterator it = resourceLoaders.iterator(); it.hasNext();)
            {
               //…………
    
                try
                {
    
                    if (resource.process())
                    {
                        //………………
                    }
                }
                catch (ResourceNotFoundException rnfe)
                {
                    /*
                     *  that's ok - it's possible to fail in
                     *  multi-loader environment
                     */
                }
            }
      //…………
    
            return resource;
        }
    

    最重要的还是在这句上

    resource.process()
    

    跟踪进入template的代码

       try
            {
                is = resourceLoader.getResourceStream(name);
            }
    

    velocity的resourceLoader支持了多种文件读取方式,具体的见我以前写的文章。

    默认的FileResourceLoader,我试了下竟然不支持绝对路径的读取。。。我很懒,所以我懒得重写resourceLoader。

    如果切入点不能放在template上,貌似还有另一种方式,可以通过字符串直接代替模板的方式。

    最简单的就是:

            String s = "你好We are using $project $name to render this.";
            w = new StringWriter();
            Velocity.evaluate( context, w, "mystring", s );
    

    不过用string不可能,最好能直接操纵流来解析。

    后来发现evaluate还有重载的函数,可以直接对字节流进行处理,相当的nice,入口找到了。。省了很多功夫。

    public static boolean evaluate( Context context, Writer writer,
                                        String logTag, InputStream instream ){
    //…………
    }
    

    有了这个,实现一下代码生成器不难了。

  • 相关阅读:
    Live2d Test Env
    关于word2vec的一些问题
    排序链表
    最长回文子串
    前缀树
    验证回文串
    最大子序和/积
    构建知识图谱-初学
    HMM-维特比算法理解与实现(python)
    跨存储后台迁移数据的三种方案
  • 原文地址:https://www.cnblogs.com/xiziyin/p/1726139.html
Copyright © 2011-2022 走看看