zoukankan      html  css  js  c++  java
  • java field, property,variable及getField和getDeclaredField的区别

    java 里面的field ,property, attribute,variable的区别

    field: 就是定义的用于保存数据的字段

    property: property是用于描述类中的特征,所以property比field的含义要广,因为特征包含的方面更加广,一个数据可以代表某方面的特征,但是并不是所有的特征都是你要的数据,它可能是类本身的某个特性的描述。

    variable:变量,就是我们平时看到的变量。

    综上:如果你要想通过反射来获取某个数据模型里面的字段的话跟Field相关,跟其它的没多大关系。

    getField:获取某个类的所有public字段(包含所继承的类的所有字段)

    需要注意的是getField这个方法有很多的条件限制:在api文档里面提到了,如果某个类(这里取名类A),类A中如果不包含public关键字修饰的Field,或类A是一个数组类型,原子类型(byte,short,int,long,char,float,double,boolean),无返回值类型的时候,这个方法返回的数组是一个长度为0的数组。假如你通过这个方法得到了要返回的字段了,这些字段是所有它的继承与实现的父类,接口,及自身的字段列表。注意public申明的是字段而不是说你的get,set 方法是用public关键字生命的,假如的定义的成员变量 a 这个字段没有public申明那么通过这个方法是取不到的。这里面有一句话蛮难理解的是“类A是一个数组类型,原子类型(byte,short,int,long,char,float,double,boolean),无返回值类型的时候”,它的意思是这个类型是你对象申明的类型,数组类型是 int []这种,而不是说你的类继承了Array这个类型。以下举个例子就理解了。

    private static String[] fieldNamesOfClass(Class aClass){
    if(aClass == null){
    return null;
    }
    Field fields[] = aClass.getFields();
    int length = fields.length;
    String fieldNames[] = new String[length];
    for (int i=0; i<length; i++){
    Field field = fields[i];
    fieldNames[i] = field.getName();
    }

    System.out.printf(fieldNames.toString());

    return fieldNames;
    }
    int []xx = new int[3];
    String[] xxfieldNames = fieldNamesOfClass(xx);

    int yy = 3;
    String[] yyfieldNames = fieldNamesOfClass(yy);

    getDeclaredField:获取当前类的字段(包含public,protected,private修饰的所有字段,不包含其所继承类的字段),所以如果你要对某个数据模型做反射的话要注意里面的字段的定义,不要冗余了

    (当然你的类或接口里面没有过申明字段,那么你掉上面那两个方法是没有一点意义的。返回的都是长度为0的数组)

    获取反射字段的方法是用 getDeclaredField;

  • 相关阅读:
    python基础学习笔记第二天 内建方法(s t r)
    p ython笔记第三天
    (转)字符编码笔记:ASCII,Unicode和UTF8
    const char * 和 char *const
    自己的毕业设计windows管理软件
    自己实现string类
    关于vs2003环境支持win7 的 IP设置
    很犀利的错误
    很容易犯的错误
    用C++ 设计一个不能被继承的类
  • 原文地址:https://www.cnblogs.com/codetime/p/5427288.html
Copyright © 2011-2022 走看看