在Java中生成getter/setter(再次)

在Java中生成getter/setter(再次),java,code-generation,annotations,getter-setter,Java,Code Generation,Annotations,Getter Setter,我正在考虑写作的方法 class MyClass { @Get @Set protected int aValue; } 然后,自动为类生成get_aValue()和set_aValue()方法 我发现了这些可能性: 1a)在编译时。使用注释处理器分别处理MyClass.java,然后编写一个新的MyClass.java,最后用剩余的.java使用后者(替换原来的) 1b)在编译时。使用注释处理器生成MyClassGenerated.java文件,其中一个新类(使用get/set

我正在考虑写作的方法


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) 这真的很难(至少对我来说)。

仅仅为了生成getter和setter方法,听起来需要做很多工作。为什么不直接使用:


(来源:)

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

说真的,如果你感觉到了语言的痛苦,不想使用字节码编织器或外部lib之类的拐杖,你应该寻找更绿色的牧场。

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


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

您缺少了一些东西,如果你想走这条路,我认为这是最好的方法:

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

这样,您的源代码保持原始状态,您不必费劲地处理临时文件,而实际编译的类正是您想要的


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


我同意大家的共识——只要使用每个IDE提供的方法在源文件中生成它们就行了。这几乎不需要比编写注释更多的时间,并且被每个开发人员和工具所理解。Java没有属性-克服它。:-)

> P>我不知道为什么没有提出另一个明显的选择,但我会考虑另一种方法,在这里你只需定义接口,并使用一个实现指定的设置器、吸气剂和内部字段所需的库。 所以您可以指定如下内容

公共接口Bean{ 公共int getX(); 公共void setX(int值); }

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

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

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

为简单的用例编写这样的库当然很重要,但使用这样的库似乎是有意义的


。。。而且很可能使用IDE最容易解决您的具体情况,不管它是什么。:-)

几乎就是您想要的,尽管实现不同。

附议。请仔细研究Scala,它与Java非常相似,您不会感到失落,但它(除其他外)消除了显式编写getter和setter代码的需要。死定了!嗯,请原谅我的革命热情。@cibercitizen1-这取决于你的水平。它们不是Java源代码,而是Java类。您可以从Java编写的类调用Scala编写的类(反之亦然),就像调用“本机”类一样自然。唯一的区别是Scala允许你(但并不强迫你)使用不同的语法,这正是你在问题中想要的。“使用另一种编程语言”类型的答案通常值得投反对票。。。此外:@Andreas_D:“通常”您是正确的,但在这种情况下,当TO试图模拟另一种语言中存在的功能(甚至是字节码兼容的)时,应该“允许”提及替代方案,尤其是当所有其他选项都很难看、复杂或危险时。@Landei(我昨天没有投票,但我也收到了一个否决票)我不使用Eclipse:-(我想你错过了我的问题中的@ GET @ SET要求。考虑使用IDE,避免拥有各种VoO。