gpt4 book ai didi

Java反射isAccessible方法

转载 作者:搜寻专家 更新时间:2023-10-30 21:23:58 25 4
gpt4 key购买 nike

我正在学习反射(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com