您的位置:首页 > 编程语言 > Java开发

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方法档在路上.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: