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; ... ... }
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇: JDK中数据类型Character、Double、Float
- 下一篇:没有了