java反射中getDeclaredField和getField的区别
Posted 狼王不乖s
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java反射中getDeclaredField和getField的区别相关的知识,希望对你有一定的参考价值。
getDeclaredField是可以获取一个类的所有字段.getField只能获取类的public 字段.
Java代码
- public Field getDeclaredField(String name)
- throws NoSuchFieldException, SecurityException
- checkMemberAccess(Member.DECLARED, ClassLoader.getCallerClassLoader());
- Field field = searchFields(privateGetDeclaredFields(false), name);
- if (field == null)
- throw new NoSuchFieldException(name);
- return field;
- rivate Field getField0(String name) throws NoSuchFieldException
- Field res = null;
- // Search declared public fields
- if ((res = searchFields(privateGetDeclaredFields(true), name)) != null)
- return res;
- ......
getField其实调用的是getField0.
他们最后都调用了searchFields.
不过getDeclaredField传入的是privateGetDeclaredFields(false),
getField传入的是privateGetDeclaredFields(true),
Java代码
- private Field[] privateGetDeclaredFields(boolean publicOnly)
- checkInitted();
- Field[] res = null;
- if (useCaches)
- clearCachesOnClassRedefinition();
- if (publicOnly)
- if (declaredPublicFields != null)
- res = (Field[]) declaredPublicFields.get();
- else
- if (declaredFields != null)
- res = (Field[]) declaredFields.get();
可以看到传入条件为true的时候使用的是declaredPublicFields,意思是public字段
为false的时候使用的是declaredFields.
当然declaredFields和declaredPublicFields最终的来源是
Java代码
- private native Field[] getDeclaredFields0(boolean publicOnly);
可惜这是个native方法.感觉java就是很无奈,发现都是native方法档在路上.
以上是关于java反射中getDeclaredField和getField的区别的主要内容,如果未能解决你的问题,请参考以下文章
JAVA反射中的getFields()方法和getDeclaredFields ()方法的区别
Java反射 getFields和getDeclaredFields的区别