3

我正在考虑写作的方法


class MyClass {
  @Get
  @Set
  protected int aValue;
}

然后,自动为该类生成 get_aValue() 和 set_AValue() 方法。

我发现了这些可能性:

1a) 在编译时。使用注解处理器单独处理 MyClass.java,然后编写一个新的 MyClass.java,最后将后者(替换原来的)与 .java 的其余部分一起使用

1b) 在编译时。使用注释处理器生成一个 MyClassGenerated.java 文件,其中包含一个新类(使用 get/set 方法),该类是原始 MyClass 的子类。

2) 在运行时。使用 java.lang.instrument 和外部工具(如 BCEL)在 MyClass.class 中编织新代码。

好吧,问题是:考虑到我尽可能不想使用第三方库(如 lombok 项目或 BCEL)

a)我是否错过了任何其他方法?

b) 你会使用哪种方法?

我想我会使用 1a) 因为

1b) 不干净(程序的其余部分应该使用 MyClassGeneradted 而不是原来的 MyClass,尽管这可能只是名称问题)

2)真的很难(至少对我来说)。

4

6 回答 6

5

这听起来像很多工作只是为了生成 getter 和 setter 方法。为什么不直接使用eclipse 的 getter 和 setter 生成器

生成 getter 和 setter 屏幕截图
(来源:eclipse-blog.org

于 2010-07-13T11:40:03.760 回答
4

你错过了一些东西,如果你想走这条路,我想说这是最好的方法:

1c) 在编译时。正常编译类,然后使用 APT 注释处理器修改.class文件(不是源文件),以将适当的 get 和 set 方法添加到字节码。

这样,您的源代码将保持原始状态,您不必为临时文件而烦恼,并且实际编译的类完全符合您的要求。


尽管如此,这是用大锤打开一个螺母。这是可行的,但现在你的代码并不是严格意义上的 Java,因为如果有人接受它并javac在上面运行,他们将获得一个没有 getter 和 setter 的类。这将使调试变得困难,因为所有的行号都会被弄乱,除非你非常确定你的注释处理器做了正确的事情,否则你甚至无法看到 getter 和 setter 的来源纠正错误。静态分析工具会告诉您该属性从未使用过,等等。

我有一个普遍的共识——只需使用每个 IDE 为您提供的方法在源文件中生成它们。这只需要编写注释所需的时间,并且每个开发人员和工具都可以理解。Java 没有属性——克服它。:-)

于 2010-07-13T11:46:14.670 回答
3

实际上,我通常使用方法 3 - 我只是对字段进行编码并使用 eclipse IDE 自动生成 getter 和 setter 方法。(netbeans 和 IntelliJ 应该有类似的特性)

使用 IDE 的自动生成工具,您甚至可以定义生成的 getter/setter 方法的可见性(您可能希望将 setter 的可见性限制为私有),或者如果您需要方法主体的附加代码,则可以编辑模板。

于 2010-07-13T11:40:58.020 回答
3

Lombok 项目几乎正是您想要的,尽管实现方式有所不同。

于 2011-04-27T04:30:24.760 回答
2
  • a)您可以使用支持该功能的 JVM 语言(与 Java 兼容)
  • b) 我会用 Scala 编写它

说真的,如果您感到语言的痛苦并且不想使用字节码编织器或外部库之类的拐杖,那么您应该寻找更绿色的牧场。

于 2010-07-13T11:40:39.143 回答
1

我不知道为什么没有建议另一个明显的选择,但我会考虑另一种方法,您只需定义接口,并使用实现指定的 setter、getter 和所需内部字段的库。

所以你会指定类似的东西

公共接口 Bean { public int getX(); 公共无效setX(int值);}

并要求库为此实例化类型(也许还有用于创建类型实例的便捷方法)。如有必要,可以在必要时使用注释进行进一步配置,但对于 get/set 样式 bean,情况并非如此。

这与您的 (2) 不同,除非我遗漏了什么,否则它不会按原样工作:事情是,您必须在编译期间有可用的方法。这就是使用接口可以解决的问题。将需要代码生成,但可以自动化。

我希望这样的库存在,但如果没有,使用字节码生成库(asm、cglib、janino、javassist 等)编写通用库应该是完全可行的。

为简单的用例编写这样的库当然是重量级的,但使用一个似乎是有意义的。

...而且很可能使用 IDE 最容易解决您遇到的特定情况,无论它是什么。:-)

于 2010-07-13T20:11:33.117 回答