java.lang.reflect.AccessibleObject

一、基本介绍

java.lang.reflect.AccessibleObject类是Field,Method和Constructor类对象的基类。 它提供了将反射对象标记为在使用它时抑制默认Java语言访问控制检查的功能。 当使用Fields,Methods或Constructors类对象来设置或获取字段,调用方法,或创建和初始化新的类实例时,执行访问分别检查(对于public,默认(包)访问,protected和private成员) 。
在反射对象中设置可访问标志允许具有足够权限的复杂应用程序(如Java对象序列化或其他持久性机制)以被禁止的方式操作对象。

二、类图(继承体系结构)

(查看类图快捷键mac:command+option+shift+U)
在这里插入图片描述

三、基本作用

1、将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力。
2、在反射对象中设置accessible 标志允许具有足够特权

四、常用方法

1)setAccessible(boolean flag)

将此对象的accessible标志设置为指示的布尔值。 值为true表示反射对象在使用时应禁止 Java 语言访问检查。 值false表示反射对象应该强制执行 Java 语言访问检查。
首先,如果存在安全管理器,则使用ReflectPermission(“suppressAccessChecks”)权限调用其checkPermission方法。
如果flag为true但此对象的可访问性可能不会更改(例如,如果此元素对象是类Class的Constructor对象),则会引发SecurityException 。
如果此对象是类java.lang.Class的Constructor对象,并且flag为真,则会引发SecurityException 。

参数:flag – accessible标志的新值
抛出:SecurityException – 如果请求被拒绝。
也可以看看:SecurityManager.checkPermission , RuntimePermission

public void setAccessible(boolean flag) throws SecurityException {
SecurityManager sm = System.getSecurityManager();
if (sm != null) sm.checkPermission(ACCESS_PERMISSION);
setAccessible0(this, flag);
}

  • 当输入参数flag为true的时候,指示反射对象被使用时取消Java语言访问权限的检查。

  • 当输入参数flag为false的时候,指示反射对象应该实施Java语言访问权限的检查。

2)isAccessible()

获取此对象的accessible标志的值。
返回:对象的accessible标志的值

public boolean isAccessible() {
return override;
}

五、子类 Field

1)类图 关系

在这里插入图片描述

public final
class Field extends AccessibleObject implements Member {

2) demo实践(POI导出Excel)

上篇博客讲述了对Field的基本使用setAccessible作用,突然想到了在POI实现导出Excel的功能时,也是通过反射获取属性信息的。
如下是poi部分代码:

Field field = obj.getClass().getDeclaredField(dataBeans.get(j).getType());
            if (field != null) {
              field.setAccessible(true);
              Object va = field.get(obj);
              if (va == null) {
                va = "";
              }
              sheet.addCell(new Label(j, i, va.toString(), wcf_left));
            }

之前写过一篇导出Excel,反射获取信息报错的文章,主要就是如何获取父类实体信息反射 getDeclaredField 报错java.lang.NoSuchFieldException

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值