java - isAccessible() 对公共(public) setter 返回 false

标签 java reflection jemos-podam

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

PODAM 在制造我的对象时报告此行日志记录:

The setter: setId is not accessible.Setting it to accessible. However this is a security hack and your code should really adhere to Javabean standards.

当我的每一个 setter 尝试填充一个对象时,我都会收到此警告。在本例中,setId() 包含以下内容:

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

有谁知道为什么这个错误被标记,因为该方法是公共(public)的,为什么它被标记为“不可访问”。

我查看了 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 实际上运行良好,并按照我的需要用随机数据填充所有字段。我只是好奇为什么每次都会收到此错误,以及代码中是否存在问题导致其不遵守标准。

最佳答案

isAccessible() returning false for public setters

是的。应该可以。根据the javadocsaccessible 标志确定当您尝试通过 Method 对象(反射地)调用该方法时,Method 对象是否忽略正常的 Java 访问规则。根据 javadoc,该标志默认为 false ...意思是“应用 Java 访问规则”。

但是。您发布的代码片段似乎将 accessible 标志误解为指示可以调用该方法。这是不正确的......最终结果是虚假警告。

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

关于java - isAccessible() 对公共(public) setter 返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23361320/

相关文章:

java - 为什么我不能在 JavaDoc 中使用 <abbr> 标记?

reflection - Kotlin - 获取 KProperty1<T, out R> 的属性类型

.net - 更改了 .Net 4 中泛型方法的 LdToken 行为?

Java:运行时方法解析

java - 如何使用PODAM获取data[]属性

Java 监视器 : How to know if wait(long timeout) ended by timeout or by Notify()?

java - Eclipse PDE 日志记录缺少方法

java - list 合并失败问题 Android 支持

java - 禁用烦人的 PODAM 日志