jjzjj

java - 有没有办法以编程方式从模板生成 java 类?

coder 2024-04-04 原文

我需要一个库或方法来从模板文本文件生成 java 类(只需将类的源代码生成为文本格式,无需运行或使用它)。

例如我有一个类模板

package packagename.name.abc;

import lib.sub.sub;

import lib.sub.sub2;

public class templateClass {

    public String getTemplateText() {
    //some operations here.
    }

    PlaceController getPlaceController() {
    //some operations here.
    }

}

我想向模板添加一个库导入、一个函数导入和一个参数或行添加,并将模板添加到一个项目中。 //操作

导入操作后代码如下:

package packagename.name.abc;

import lib.sub.sub; 
import lib.sub.sub2;
import NEWLIB.NEWSUB.NEWSUB;                 // NEW LIBRARY

public class templateClass {

    public String getTemplateText(String PARAMETER ) { // NEW PARAMETER
    //some operations here.
    String NEW_LINE = "";                // NEW LINE
    }

    PlaceController getPlaceController() {
    //some operations here.
    }

    public String getNEWText() {             //NEW FUNCTION
    //some operations here.
    }

}

我为这个操作搜索了一些库 FreeMarker 和 ApacheVelocity 被推荐用于一些类似的问题。但我不完全了解如何使用 FreeMarker 执行此操作。我认为它更有可能用作标记库(如 JSTL)我不想在代码中使用模板关键字(如 $(temp) )只是函数“doImport”、“addFunction”、“addParameterToFunction”等。是吗可能使用这个库或者任何人都可以发送一些关于这个操作的例子吗?

最佳答案

实际上,您想以任意方式修改任意一段代码。

要以一般方式执行此操作,您几乎需要能够解析文本,以便可以将结构放置在适当的结构化位置。通常使用的模板只是文本;没有可以挂帽子的结构。

最可靠的方法是使用源到源 program transformation系统。这样的工具允许您明确声明,“如果您看到这个,则用那个替换它”。 为了实现您的目的,您会说类似“如果您在类 X 中看到一组类声明,则添加此类”,通常表示为

  a rewritesto b if condition c

DMS Software Reengineering Toolkit是一个会读取源代码的程序转换工具, 构建编译器数据结构(AST、符号表、流程图),允许您对表示为这些结构的代码应用源到源重写,使用源模式进行匹配/替换,然后从结果中重新生成有效源。

DMS 具有适用于多种语言的解析器/ pretty-print ,包括 Java (1.4/1.5/1.6)、C、C++、C#、COBOL、PHP、JavaScript...

对于您的添加参数任务,您可以使用 DMS 编写以下转换规则:

add_string_parameter(r:result_type,m:IDENTIFIER,p:parameter_list):
    method_signature->method_signature
=  " \r \m ( \p ) " -> " \r \m ( \p , String PARAMETER ) " if m="getTemplateText";

(-> 对应于“rewritesto”)这识别方法签名(通过搜索 AST,而不是原始文本)。引号是包含您的目标语言片段的元引号,需要将目标语言文本与规则语言文本区分开来。 r、m、p 是元变量,必须匹配给定规则签名的特定结构;\r\m\p 是目标文本中的元转义符,表示必须存在这些结构。左侧“\r\m (\p ) ”匹配签名并将 r、m、p 绑定(bind)到支持它的 AST 结构;右侧指定一个替换,其中 r、m、p 的绑定(bind)值被替换以获得替换。条件“如果”是为了坚持只修改所需的方法;如果您有一大堆代码并且只想调用其中的特定方法,则可能需要更复杂的条件。

关于java - 有没有办法以编程方式从模板生成 java 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6816273/

有关java - 有没有办法以编程方式从模板生成 java 类?的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby - 难道Lua没有和Ruby的method_missing相媲美的东西吗? - 2

    我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/

  5. ruby-on-rails - rails 目前在重启后没有安装 - 2

    我有一个奇怪的问题:我在rvm上安装了ruby​​onrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(

  6. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  7. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  8. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  9. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  10. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

随机推荐