Java反射isAccessible方法

标签 java reflection

我正在学习反射(reflection)。当我执行以下代码时:

package main;

import java.lang.reflect.Field;

public class Main {
    public static void main(String[] args) throws NoSuchFieldException, SecurityException {

        Base firstBase = new Base();
        Field firstBaseField = firstBase.getClass().getDeclaredField("protectedBuffer");
        System.out.println(firstBaseField.isAccessible());

    }
}

这是基类:

package main;

public class Base {

    private StringBuffer buffer;
    protected StringBuffer protectedBuffer;
    public StringBuffer buffer2;

}

结果是假的。但这不应该是真的吗,因为我可以通过这种方式访问​​ protectedBuffer:firstBase.protectedBuffer?

最佳答案

那是因为当您执行 firstBaseField.isAccessible();

时,您没有测试 Field protectedBuffer 是否可访问

这里发生的是您检查 AccessibleObject 的值,它是 Field 的基类。 此标志不会告诉您字段是否可通过 java 访问修饰符访问,它会告诉您这些修饰符当前是否被忽略。

当您在 firstBaseField.isAccessible() 上得到 false 时,这仅仅意味着 java 访问规则仍然存在并且没有被反射机制覆盖。

setAccessible()

Set the accessible flag for this object to the indicated boolean value. A value of true indicates that the reflected object should suppress Java language access checking when it is used. A value of false indicates that the reflected object should enforce Java language access checks.

编辑

要测试该字段是否可以通过 java 访问修饰符访问,您可以尝试访问它并捕获 IllegalAccessException,如下例所示。

Field field = instance.getClass().getDeclaredField("someField");
//  IllegalAccessException
field.get(instance);

关于Java反射isAccessible方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32024118/

相关文章:

java - 如何从 .json 文件中删除元素?

c# - .NET反射的 "cost"是什么?

java - PropertyUtils.copyProperties 什么时候可以静默失败?

c# - 如何在泛型集合中转换对象?

java - 如何从字符串中获取数字值,并使用 for 循环将它们转换为 int?

java - numberFormat 对象在转换为字符串时丢失值

java - DbUnit 和 JSON 列类型支持

c# - 在结构上调用内部方法

java - 使用反射没有性能问题

java - HashTable 中的 ArrayList 是线程安全的