代码生成器,想想看

搞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 ){

//…………

}

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

 

 

 

 

 

你可能感兴趣的:(代码生成)