Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java field.setAccessible(false)对非私有字段的影响_Java_Reflection - Fatal编程技术网

Java field.setAccessible(false)对非私有字段的影响

Java field.setAccessible(false)对非私有字段的影响,java,reflection,Java,Reflection,field.setAccessible(false)对非私有字段有什么影响 我原以为访问此成员会被拒绝,但事实并非如此 我试图深入研究源代码,但在某个时候()我忘记了正在发生的事情 我为这种情况创建了一个特殊类: public class DemoObject { public Object publicMember = new Object(); protected Object protectedMember = new Object(); Object defau

field.setAccessible(false)
对非私有字段有什么影响

我原以为访问此成员会被拒绝,但事实并非如此

我试图深入研究源代码,但在某个时候()我忘记了正在发生的事情

我为这种情况创建了一个特殊类:

public class DemoObject {

    public Object publicMember = new Object();
    protected Object protectedMember = new Object();
    Object defaultMember = new Object();
    private Object privateMember = new Object();
    public final Object publicfinalMember = new Object();
    protected final Object protectedfinalMember = new Object();
    final Object defaultfinalMember = new Object();
    private final Object privatefinalMember = new Object();

}
并创建了一个演示:

import java.lang.reflect.Field;

public class MyMain {

    public static void main(final String[] args) {

        DemoObject object = new DemoObject();

        System.out.println("'reflective' member access after field.setAccessible(false)");
        for (Field field : object.getClass().getDeclaredFields()) {
            field.setAccessible(false);
            try {
                System.out.println(field.getName() + ": " + field.get(object));
                // only throws exception for the privateMember and privatefinalMember
            } catch (Exception e) {
                e.printStackTrace();
            }

        }

        System.out.println("'reflective' member access after field.setAccessible(true)");
        for (Field field : object.getClass().getDeclaredFields()) {
            try {
                field.setAccessible(true);
                System.out.println(field.getName() + ": " + field.get(object));
                // throws no exception
            } catch (Exception e) {
                e.printStackTrace();
            }

        }

    }

}
输出:

'reflective' member access after field.setAccessible(false)
publicMember: java.lang.Object@e9bfee2
protectedMember: java.lang.Object@237aaeec
defaultMember: java.lang.Object@4b721a26
java.lang.IllegalAccessException: Class MyMain can not access a member of class DemoObject with modifiers "private"
    at sun.reflect.Reflection.ensureMemberAccess(Unknown Source)
    at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(Unknown Source)
    at java.lang.reflect.AccessibleObject.checkAccess(Unknown Source)
    at java.lang.reflect.Field.doSecurityCheck(Unknown Source)
    at java.lang.reflect.Field.getFieldAccessor(Unknown Source)
    at java.lang.reflect.Field.get(Unknown Source)
    at MyMain.main(MyMain.java:13)
publicfinalMember: java.lang.Object@7c30cd64
protectedfinalMember: java.lang.Object@67fc9fee
defaultfinalMember: java.lang.Object@7a67f797
java.lang.IllegalAccessException: Class MyMain can not access a member of class DemoObject with modifiers "private final"
    at sun.reflect.Reflection.ensureMemberAccess(Unknown Source)
    at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(Unknown Source)
    at java.lang.reflect.AccessibleObject.checkAccess(Unknown Source)
    at java.lang.reflect.Field.doSecurityCheck(Unknown Source)
    at java.lang.reflect.Field.getFieldAccessor(Unknown Source)
    at java.lang.reflect.Field.get(Unknown Source)
    at MyMain.main(MyMain.java:13)
'reflective' member access after field.setAccessible(true)
publicMember: java.lang.Object@e9bfee2
protectedMember: java.lang.Object@237aaeec
defaultMember: java.lang.Object@4b721a26
privateMember: java.lang.Object@424c2849
publicfinalMember: java.lang.Object@7c30cd64
protectedfinalMember: java.lang.Object@67fc9fee
defaultfinalMember: java.lang.Object@7a67f797
privatefinalMember: java.lang.Object@15e8f2a0

根据方法文件:

值false表示反射对象应强制执行Java语言访问检查

因此,设置
false
值并不意味着无法访问该字段。这只意味着将强制执行普通的Java访问规则


因此,
public
成员将按正常方式访问。受保护的
成员也是如此(它们将在同一个包中访问,在其他包中可以访问子类)。

你的结论是什么?我猜它没有任何作用。但我不确定!这就是为什么我要问这个问题。我的意思是:运行程序后,你的观察结果是什么?你能解释一下-1吗?就是这个!我是瞎的;-)@菲利普桑德。没问题:)而且没有其他副作用吗?@PhilippSander。我想不需要。除非您想撤销之前发布的限制,否则实际上不需要调用该方法。