【问题标题】:Identify valid getters and setters识别有效的 getter 和 setter
【发布时间】:2015-07-23 00:47:34
【问题描述】:

我有一个需求,想扫描一个java(POJO)文件的目录,遍历它们,找出那些POJO中定义的相应变量,并检查它是否具有正确的getter和setter名称。例如:- 如果empName 是变量名,那么它应该具有getEmpName() 而不是getempName() 的getter。

这是因为我们在很久以前构建的 J2EE 应用程序由于使用了无效的 getter 和 setter 而开始失败,而前端技术无法识别这些。

我已经完成了一个可以确定这一点的基本程序。我的确切问题是我可以在什么基础上识别一行中的变量。在我的逻辑中,我假设包含private 关键字的行中的第三个单词将是变量名。只是想知道这种方法是否正确,还是我需要尝试不同的方法,因为似乎要求非常通用。

【问题讨论】:

  • 不要将源文件扫描为文本。使用反射。
  • 我不确定,但 apache-commons-beanutils 可能有这样的东西
  • 使用 checkstyle 之类的代码分析工具可能更容易做到这一点。
  • 谢谢大家,让我试试上面的建议,同时@Qwerky,是否可以设置诸如通过checkstyle或sonar识别getter之类的规则?
  • 是的,标准 JEE 或自定义一个

标签: java setter getter


【解决方案1】:

尝试自己扫描源文件会很痛苦,并且会涉及很多边缘情况等。

例如,变量的限定符可以是任意顺序,可以有多个。数组括号可以在变量名之前或之后,变量可能会或可能不会被初始化等。有些可能会被注释掉或在内部类中。

您最好的方法是使用反射并使用它扫描对象。

反射是允许运行 Java 代码了解自身的原因。您可以编写一个小程序并将要扫描的代码添加为该程序的库。然后程序可以扫描这些 jar 中的类,并为每一个使用反射来查询其中的方法和变量列表。

http://docs.oracle.com/javase/tutorial/reflect/

【讨论】:

  • 正是你说的,这是我所拥有的大开销。我还没有听说过反射技术,任何人都可以建议一些好方法来研究一下吗?
  • 我已经为你添加了一些关于反射的信息。
【解决方案2】:

您忘记了变量可以有更多的限定符,而不仅仅是可见性限定符:

private transient volatile int someVariable;

是有效的语法。它是一个私有变量,未序列化,线程间共享。

也可能没有可见性限定符,这会导致包私有变量(可以由同一包中的类访问,但不能从其他包中的类访问)。

int otherVariable;

您可以依赖的是变量名本身总是后跟 0-n 个空格和 =;。除非它是一个数组,但是用简单的 getter 和 setter 公开数组通常不是一个好主意。

方法名称后面总是跟 0-n 个空格和一个 (

【讨论】:

  • 谢谢老兄,我有一个非常相似的方法,你建议的基尔,仍然需要更多,过滤更多不需要的字符,现在在测试时我遇到了 POJO 中的方法定义,我猜这些东西需要完善
  • @SureshkumarPanneerselvan 您能否写一个答案来解释哪些 QA 工具可以用于此以及如何使用它们?
  • @Philipp 添加了答案。
【解决方案3】:

大多数 IDE(Eclipse、Netbeans 和 IntelliJ IDEA)都有质量工具​​插件(Checkstyle、PMD 和 FindBug)。

SONAR、FISHEYE等外部工具也可以使用。

请检查此link 以了解 PMD 启动。

【讨论】:

    猜你喜欢
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    相关资源
    最近更新 更多