java 反射 getDeclaredField和getField的区别
2016-02-23 13:25
525 查看
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方法档在路上.
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源码级注解处理+字节码级注解处理
- Java 生成唯一性标识解决方案与重复概率分析
- Java的BIO、NIO和AIO介绍
- JAVA基础(17) Java虚拟机工作原理详解
- java基础—java中使用final关键字的总结
- 解析scope为singleton的spring组件其数据完整性问题和jvm的内存关系
- 面向对象04-java基础
- struts2源码的自我理解
- java回调函数的初步理解
- JavaBean与表单
- 一个简单音乐播放器的java实现(一)
- jenkins调整jdk版本不生效的解决办法
- 大坑----java生成xls,xlsx文件的行数啊
- 初学Struts
- JAVA反射系列之Field,java.lang.reflect.Field使用获取方法。
- MyEclipse 2014 搭建 Android 开发环境
- java反射机制详解
- JAVA锁漫谈,最好的锁是无锁
- JAVA学习笔记(一):一个小爬虫的例子
- Java编程思想 第1章 对象导论