笔记:setAccessible方法启用/禁用访问控制权限

class A {

      private int i;

      public int getI() {
            return i;
      }

       private void setI(int i) {
            this.i = i;
      }
}



  Class<?> clazz = Class.forName("hadoopclient.A");
            
            Field iField = clazz.getDeclaredField("i");
            System.out.println("i: "+iField);
            Method getI = clazz.getMethod("getI", new Class[]{});
            System.out.println("getI:\t"+getI);
            Method setI = clazz. getDeclaredMethod("setI", new Class[]{int.class});
            System.out.println("setI:\t"+setI);
            
            Object newInstance = clazz.newInstance();
            
            Object returnValue = getI.invoke(newInstance,new Class<?>[]{});
            System.out.println("init:\t"+returnValue);
            
           setI.setAccessible(true); //若无此句将抛异常
            setI.invoke(newInstance, new Object[]{100});
            returnValue = getI.invoke(newInstance, new Class<?>[]{});
            System.out.println("invoke setI(100):\t"+returnValue);
             
      }
}

注意:
setAccessible(true) 并不是将方法的访问权限改成了public,而是取消java的权限控制检查。所以即使是public方法,其accessible 属相默认也是false

JDK 文档:

setAccessible

public void setAccessible(boolean flag) throws SecurityException
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.

First, if there is a security manager, its checkPermission method is called with a ReflectPermission("suppressAccessChecks") permission.

SecurityException is raised if flag is true but accessibility of this object may not be changed (for example, if this element object is a Constructor object for the class Class).

SecurityException is raised if this object is a Constructor object for the class java.lang.Class, and flag is true.

Parameters:
flag  - the new value for the  accessible  flag
Throws:
SecurityException  - if the request is denied.
See Also:
SecurityManager.checkPermission(java.security.Permission) RuntimePermission
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值