gpt4 book ai didi

java - 想法 : Embed data/DSLs in Java as comments and generate Java code with APT

转载 作者:行者123 更新时间:2023-12-04 07:09:05 25 4
gpt4 key购买 nike

我有一个想法,我想由你来运行它以获得一些反馈。请仔细查看以下内容,让我知道您的想法,无论是积极的还是消极的。

我一直希望有一种方法可以将某些数据嵌入到 Java 代码中,而不必一直遵循 Java 的规则。我最近听到了很多关于领域特定语言 (DSL) 的讨论,如果我们每天都能更多地利用它们,那该有多好。我想我知道如何以一种相当优雅的方式做到这一点。

以下是一些我所知道的在 Java 代码(和其他类似 C 的语言)中表示很痛苦的事情的一些例子,我希望它解决:

短字符串列表作为字符串数组

String[] ar = { "Item1", "Item2", "Item3", "Item4" };

长字符串列表作为字符串数组
String[] ar = { "The quick brown\n fox jumped over\n the lazy dog.",
"The quick brown\n fox jumped over\n the lazy dog.",
"The quick brown\n fox jumped over\n the lazy dog.",
"The quick brown\n fox jumped over\n the lazy dog.", };

作为多维字符串数组的字符串表:
String[][] ar = { { "InvoiceID", "Date", "SubTotal", "Tax", "Total" },
{ "1", "1/2/2009", "300, "21", "321" },
{ "2", "1/4/2008", "100", "7", "107" },
{ "3", "1/6/2008", "200", "14", "214" } };

键值对列表
Map states = new HashMap();
states.add("FL", "Florida");
states.add("OH", "Ohio");
states.add("GA", "Georgia");
states.add("NY", "New York");
states.add("SC", "South Carolina");

HTML代码单字符串
String html = "<a href=\"www.somesite.com\">Some site</a>";

具有体面文本格式的 HTML 文本块
String html = "Hi, John,\r\n<br>\r\n<br>Thank you for writing to us. We do not currently carry that specific product.\r\n<br>\r\n<br>Regards,\r\n<br>";

我对以下描述的解决方案进行了一些调查,我相信可以创建一个可用的库来让您优雅地实现这一目标。在 Java 5 和 6 中有一种叫做 Annotation Processor Tool (APT)(与 Debian APT 不同)的东西。您创建自己的源代码处理器,在编译代码时将调用该处理器,以便您有机会重写源代码。重写代码后,它会像往常一样编译。

要使用 APT,必须执行以下操作:
1. 将此库的 jar 放在 ANT 类路径上。
2. 将这个库的 jar 放在项目类路径上。
3.调用apt任务而不是javac,并添加preprocessdir参数指定生成的文件必须放在哪里。

DSL 代码可以放在注释中,紧跟在代码结果将被放置的变量之后。当处理器运行时,它可以在代码中寻找下一个注释,提取代码,通过处理器运行它,生成代码并进行编译。

这是列表,这次是它的样子:

短字符串列表作为字符串数组
@DslTextArray
String[] ar = null; /* Item1, Item2, Item3, Item4 */

长字符串列表作为字符串数组
@DslMultilineTextArray
String[] ar = null;
/*
The quick brown
fox jumped over
the lazy dog.

The quick brown
fox jumped over
the lazy dog.

The quick brown
fox jumped over
the lazy dog.

The quick brown
fox jumped over
the lazy dog.
*/

作为多维字符串数组或 JTable 的字符串表:
@DslTextTable
String[][] ar = null;
/*
InvoiceID,Date,SubTotal,Tax,Total
1,1/2/2009,300,21,321
2,1/4/2008,100,7,107
3,1/6/2008,200,14,214
*/

键值对列表
@DslMap
Map states = null; /* FL=Florida, OH=Ohio, GA=Georgia, NY=New York, SC=South Carolina */
// Could also put each pair on a new line

HTML代码单字符串
@DslText
String html = null; /* <a href="www.somesite.com">Some site</a> */

具有体面文本格式的 HTML 文本块
@DslText
String html = null;
/*
Hi, John,

Thank you for writing to us. We do not currently carry that specific product.

Regards,
Mike
*/

我可以想到此解决方案的一些要求/功能:

您必须声明该变量以保存脚本将在 Java 源代码中生成的数据。这允许其余的源代码知道结果数据,即使编译器不知道它来自哪里。
  • 不得违反 Java 语言,以免 IDE 和 javac 显示错误。
  • 使用您拥有的所有现有 Java 代码。无需替换任何现有代码。只需在您喜欢的任何地方添加这些片段即可。
  • 必须易于使用其他类型进行扩展。
  • 必须能够稍后对 IDE 进行扩展,以允许源代码突出显示和自动完成。
  • 翻译发生在编译时,因此必须生成有效的 Java 代码。
  • 为列表、多行文本块(如 CSS、SQL)转换为 String 和 String[]
  • 转换和编码 XML、HTML
  • 重写代码时保留相同的行号。不要添加任何行,以免调试和读取错误变得痛苦。
  • 在运行时运行用任何 BSF 语言编写的代码。允许它向脚本传递任何参数并将任何 Java 类或原语返回给 Java。
  • 在编译时运行用任何 BSF 语言编写的代码以生成 Java 源代码。类似于在 Linux 上使用 M4 的方式。
  • 稍后:允许您将多次调用的字符串结果链接在一起以构建一个长字符串。有些可能是编译时,有些则是运行时。

  • 再次,我真的很感激得到一些反馈。这是一个愚蠢的想法吗?已经有这样的东西了吗?你会费心使用这样的东西还是我应该把它留给自己?

    最佳答案

    我将使用 google collections api 现在是 Guava 库的一部分 http://code.google.com/p/guava-libraries/它有很棒的列表和 map 支持。它支持您试图实现的那种构造

    public static final ImmutableList<Color> GOOGLE_COLORS
    = new ImmutableList.Builder<Color>()
    .addAll(WEBSAFE_COLORS)
    .add(new Color(0, 191, 255))
    .build();

    关于java - 想法 : Embed data/DSLs in Java as comments and generate Java code with APT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/653030/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com