`

java 反射 getDeclaredField和getField的区别

 
阅读更多
getDeclaredField是可以获取一个类的所有字段.
getField只能获取类的public 字段.


 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;
    }


private 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),



 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最终的来源是

 private native Field[]       getDeclaredFields0(boolean publicOnly);


可惜这是个native方法.感觉java就是很无奈,发现都是native方法档在路上.

分享到:
评论

相关推荐

    java 反射简单用例

    java反射的用例代码 // //获取类对象的属性 // Field field = clazz.getDeclaredField("name"); // System.out.println(field); // // Method method = clazz.getDeclaredMethod("getName", new Class[]{}); // ...

    反射工具类ReflectionUtils.java

    进行数据库查询操作经常用到,包括getDeclaredField、getDeclaredMethod、getFieldValue、getSuperClassGenricType、getSuperGenericType、invokeMethod、makeAccessible、setFieldValue

    frida反射调用对象中的方法与字段.pdf

    该篇文章主要介绍当我们碰到参数或者返回值是一个对象时,如何通过frida反射调用该对象的方法(methods)与获取该对象的字段(fields)。感兴趣的朋友可以下载下来看看,了解了解

    Java 高级特性.doc

    JAVA高级特性 1.静态导入:先举个离例子 。 import java.lang.Integer.parseInt; public class StaticImport { int x = parseInt("123"); System.out.println(x); } 这样的程序如果不在IDE 工具中输入,是很难...

    day021-反射和注解笔记和代码.rar

    基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象; 注意 : 1、 Class类 和它的实例的产生: Class的对象是已经存在的类型, 所以不...

    Java高级特性之反射是什么?

    对象.getClass()(二)获取成员变量1.Field[] getFields()2.Field getField(String name)3.Field[] getDeclaredFields()4.Field getDeclaredField(String name)5.Field:成员变量5.1.获取值5.2.设置值(三)获取构造...

    xmljava系统源码-MyTabLayout:修改系统的TabLayout来改变Indicator(下划线)的样式

    java系统源码 一、简述: 最近项目中有个需求,效果如下图:我的做法是使用系统的TabLayout来实现,但是系统的TabLayout的下划线的长度是每个Item的长度,太长了,而且UI还要求下划线的是圆角,于是我就想办法解决这...

    再解Java中的String

    朋友问我String的内容是真的不可变吗?我肯定告诉他是的?因为在我的主观意识里String是一个不可变的对象。于是他给我发了这段程序: ... Field a_ = String.class.getDeclaredField("value"); a.se

    JxBrower6.21破解版

    Field e = ba.class.getDeclaredField("e"); e.setAccessible(true); Field f = ba.class.getDeclaredField("f"); f.setAccessible(true); Field modifersField = Field.class.getDeclaredField("modifiers"); ...

    Json解析ParsreTools.zip

    Field field = cls.getDeclaredField(varName[i]); String type = field.getGenericType().toString(); Object object = new Object(); if (type.equals("int")) { object = jsonObject2....

    GPRS网络开关

    final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService"); iConnectivityManagerField.setAccessible(true); final Object iConnectivityManager = iConnectivityManagerField.get...

    Action Bar初识案例

    Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey"); if(menuKeyField != null) { menuKeyField.setAccessible(true); menuKeyField.setBoolean(mconfig, false); } } catch ...

    Android raw 目录下视频的缩略图的获取

    Android raw 目录下视频的缩略图的获取 以下代码用于获取 Android raw目录下视频文件的缩略图: /** * 获取 raw 下 指定视频文件的... id = R.raw.class.getDeclaredField(aVideoName).getInt(this); Uri videoUR

Global site tag (gtag.js) - Google Analytics