isAccessible()为公共setter返回false

时间:2014-04-29 09:54:02

标签: java reflection jemos-podam

我正在使用PODAM在一些JUnit测试用例中使用一些测试数据填充我的对象。我遇到了一个对我没有意义的错误。

PODAM在制作我的对象时会报告这一行记录:

  

setter:setId不可访问。将其设置为可访问。然而   这是一个安全黑客,你的代码应该真正遵守Javabean   标准。

在我尝试填充对象时,我的每一个二传手都会收到此警告。在这种情况下,setId()包含以下内容:

public void setId( int id )
{
    this.id = id;
}

有没有人知道为什么这个错误会被标记,因为该方法是公开的,为什么它被标记为“无法访问”。

我查看了PODAM源代码并检查方法是否可访问,每次返回false时,PODAM会在调用方法之前将方法设置为可访问:

if (!setter.isAccessible()) {
                    LOG.warn("The setter: {} is not accessible.Setting it to accessible. "
                            + "However this is a security hack and your code should really adhere to Javabean standards.",
                            setter.getName());
                    setter.setAccessible(true);
                }
                setter.invoke(retValue, setterArg);    

PODAM实际上工作得非常好,并根据我的需要用随机数据填充所有字段。我只是好奇为什么每次都会收到此错误,如果代码中存在问题而导致其无法接受标准。

1 个答案:

答案 0 :(得分:3)

  

isAccessible()为公共设置者返回false

是。应该这样做。根据{{​​3}},当您尝试通过accessible对象(反射性地)调用方法时,Method标志确定Method对象是否忽略了正常的Java访问规则。根据javadoc,标志默认为false ...含义"应用Java访问规则"。

然而。您发布的代码段似乎误解了accessible标志,表明可以调用该方法。这是不正确的......最终的结果是虚假的警告。

这看起来像是PODAM中的一个错误,我建议你向PODAM库的维护者提出一个问题。

相关问题