代码生成器,想想看

搞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 ){
//…………
}

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

原文地址:https://www.cnblogs.com/xiziyin/p/1726139.html