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)真的很难(对我来说,至少).
解决方法
1c)在编译时.正常编译类,然后使用APT注释处理器修改.class文件(而不是源文件),以将适当的get和set方法添加到字节码.
通过这种方式,您的源代码保持原始状态,您不必使用临时文件,并且实际编译的类正如您所希望的那样.
不过,这是用大锤打开坚果.它是可行的,但是现在你的代码并不是严格意义上的Java,如果有人接受并运行javac,它们就会得到一个没有getter和setter的类.这将使调试变得困难,因为所有的行号都会搞砸,除非你非常确定你用注释处理器完成了正确的操作,否则你甚至无法看到getter和setter的源代码.纠正错误.静态分析工具会告诉您该属性从未使用过,等等.
我是普遍的共识 – 只需使用每个IDE为您提供的方法在源文件中生成它们.这比编写注释几乎没有时间,并且每个开发人员和工具都能理解这一点. Java没有属性 – 克服它.