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

来源:互联网 发布:linux exit是什么意思 编辑:程序博客网 时间:2024/05/01 19:13
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
原创粉丝点击