Java反射中getXXX和getDeclaredXXX的解析

来源:互联网 发布:js判断页面加载完毕 编辑:程序博客网 时间:2024/05/18 01:23


今天复习一下Java反射部分知识,想获得一写新的知识点,在网上搜了一遍基本差不多的内容。讲讲getDeclaredXXX()和getXXX(),从网上搜的知识来看说,getDeclaredXXX()能访问私有的方法或属性,getXXX()只能访问公有的方法或属性,我之前也停留在这种水平,下面分享一下今天的学习。

分析getFields VS getDeclaredFields,其他的类似。

getFields:返回本类中和父类中的公有属性。PS:如果该类代表的是array类、原生类型(例如:int.class)以及void   

类型,返回的是长度为0的数组。为什么只有公有属性?看源码

public Field[] getFields() throws SecurityException {        // be very careful not to change the stack depth of this        // checkMemberAccess call for security reasons        // see java.lang.SecurityManager.checkMemberAccess        checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true);//检查公有权限        return copyFields(privateGetPublicFields(null));    }
getDeclaredFields:返回本类中的public, protected, default*(package) access, private公有属性,但是不包含

类继承过来的属性。PS:如果该类代表的是array类、原生类型(例如:int.class)以及void类型,返回的是长度

为0的数组。

public Field[] getDeclaredFields() throws SecurityException {        // be very careful not to change the stack depth of this        // checkMemberAccess call for security reasons        // see java.lang.SecurityManager.checkMemberAccess        checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), true);//检查声明的访问权限        return copyFields(privateGetDeclaredFields(false));    }
到这里只有
 checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true);
 checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), true);
 这Member.PUBLIC和Member.DECLARED不一样
 在看看Member的源码:
Member是一个接口,保存着反射的信息。

public interface Member {    /**     * Identifies the set of all public members of a class or interface,     * including inherited members.     *标示类或接口所有的公共成员,并包含从父类中继承而来     * @see java.lang.SecurityManager#checkMemberAccess     */    public static final int PUBLIC = 0;    /**     * Identifies the set of declared members of a class or interface.     * Inherited members are not included.     *标示类或接口所有的声明的成员,但不包含从父类继承     * @see java.lang.SecurityManager#checkMemberAccess     */    public static final int DECLARED = 1;......}


0 0