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