用Java生成getter / setter(再次)

时间:2010-07-13 11:34:31

标签: java code-generation annotations getter-setter

我正在考虑编写

的方法

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

然后自动生成类的get_aValue()和set_AValue()方法。

我发现了这些可能性:

1a)在编译时。使用注解处理器,用于分别处理MyClass.java,然后写一个新MyClass.java,最后使用该后者(代原)与的.java的其余部分

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

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

那么,问题是:考虑到尽可能我不希望使用第三方库(如龙目岛项目或BCEL)

a)我错过了其他方法吗?

b)您会使用哪种方法?

我想我会用1a)因为

1B)不干净(该程序的其余部分应使用MyClassGeneradted代替了原来的MyClass的,虽然也许这只是名称上的差别)

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

6 个答案:

答案 0 :(得分:5)

这听起来像生成getter和setter方法很多工作。为什么不使用eclipses getter and setter generator

generate getters and setters screenshot

答案 1 :(得分:4)

你遗失了一些东西,如果你想沿着这条路走下去,我会说这是最好的方法:

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

通过这种方式,您的源代码保持原始状态,您不必使用临时文件,并且实际编译的类完全符合您的预期。


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

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

答案 2 :(得分:3)

  • a)您可以使用JVM语言 (支持Java兼容) 该
  • b)我会用Scala写的

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

答案 3 :(得分:3)

实际上,我通常使用方法3 - 我只是编写字段并使用eclipse IDE自动生成getter和setter方法。 (netbeans和IntelliJ应具有相似的功能)

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

答案 4 :(得分:3)

Project Lombok几乎就是你想要的,虽然实现方式不同。

答案 5 :(得分:1)

我不知道为什么还没有提出另一个显而易见的选择,但我会考虑另一种方法,你只需定义接口,并使用一个库来实现指定的setter,getters和内部字段。

所以你要指定像

这样的东西

public interface Bean {   public int getX();   public void setX(int value); }

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

这与你的(2)不同,除非我遗漏了某些内容,否则它将无法正常工作:事情是,你必须在编译时有可用的方法。这就是使用接口解决的问题。代码生成将是必需的,但可以自动化。

我希望这些库存在,但如果不存在,使用字节代码生成库(asm,cglib,janino,javassist等)编写通用文件应该是非常可行的。

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

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