Java反射中getXXX和getDeclaredXXX的解析


今天复习一下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;
...
...
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值