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;

java field, property,variable及getField和getDeclaredField的区别的更多相关文章

  1. getField()与getDeclaredField()的区别

    Java的反射机制中,用Class的getField(String name)或getDelaredField(String name)可以得到目标类的指定属性,返回类型是Field. 但这两个是有区 ...

  2. getField和getDeclaredField的区别

    这两个方法都是用于获取字段getField 只能获取public的,包括从父类继承来的字段.getDeclaredField 可以获取本类所有的字段,包括private的,但是不能获取继承来的字段. ...

  3. 【java】 field 和 variable 区别及相关术语解释

    Having said that, the remainder of this tutorial uses the following general guidelines when discussi ...

  4. java Field 二三事

    java在反射时候经常用到了 Field 类. 我认为代码是最好的解释,直接上代码. 首先,用到了一个bean类,源代码如下: package com.ncs;      public class P ...

  5. Java之Property类使用

    http://blog.csdn.net/hopestar2/article/details/6372883 在项目中经常用到各种配置文件,有.properties的,也有.xml格式的 都可以通过j ...

  6. JAVA基础2---深度解析A++和++A的区别

    我们都知道JAVA中A++和++A在用法上的区别,都是自增,A++是先取值再自增,++A是先自增再取值,那么为什么会是这样的呢? 1.关于A++和++A的区别,下面的来看个例子: public cla ...

  7. Java中集合List,Map和Set的区别

    Java中集合List,Map和Set的区别 1.List和Set的父接口是Collection,而Map不是 2.List中的元素是有序的,可以重复的 3.Map是Key-Value映射关系,且Ke ...

  8. Java中的“==操作符”和equals方法有什么区别

    Java中的"=="和equals方法究竟有什么区别? 1.==操作符 "=="操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的 ...

  9. 列举两种不同类型的Java标识注释,并解释它们之间的区别。

    列举两种不同类型的Java标识注释,并解释它们之间的区别.

随机推荐

  1. JVM之类加载器中篇

    先看一段代码吧! package com.tfdd.test; /** * @desc * @author chenqm * @date 2016年2月15日 */ public class Fina ...

  2. apache(nginx)+django+virutalenv(virtualenvwrapper)+gunicorn+supervisor配置高效web环境

    前言 django的调试模式配置简单,用于测试十分方便,但众所周知,这个只适合于调试,生产上运行效率十分低下. 后来考虑用nginx+uwsgi的模式进行,但之前配置过apache+wsgi的方式,感 ...

  3. 【转】 依赖注入框架Autofac的简单使用

    Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上也是很高的.于是,今天抽空研究了下它.下载地址:http://co ...

  4. 【转载】Visaul Studio 常用快捷键的动画演示

    在进行代码开发的时候,我们往往会频繁的使用键盘.鼠标进行协作,但是切换使用两种工具会影响到我们的开发速度,如果所有的操作都可以只用键盘来完成,那开发效率将得到大幅度的提升.因此,灵活地应用 Visua ...

  5. .net获取本机公网IP代码

    类的代码如下: using System; using System.Net; using System.Text.RegularExpressions; namespace Keleyi.Com { ...

  6. Think PHP项目在阿里云的虚拟主机上部署

    购买完万网的虚拟主机后,今天终于把以前一个项目转成了PHP项目,我用的是TP框架,阿里的虚拟主机还是很方便上手的,在把数据库导入完后,用FTP把程序文件上传到服务器上,阿里的虚拟主机(Linux主机) ...

  7. 在使用vs2012中的MVC4出的错误!类型“System.Data.Entity.DbContext”在未被引用的程序集中定义

    理解决方案的nuget程序包2.选中已安装的包,找到EntityFramework,点击管理 由于我是在Taobao_DAL中用到了EF的“数据上下文对象”,他报错了.所以我们要选中它,将EF5.0安 ...

  8. C++宏和枚举

    宏 我们的计算器程序,用1234对应加减乘除,对于人阅读很产生一点障碍.隔一个月后再看此代码可能想不起是0123还是1234了,还得去代码中查找,如果能为代表四则运算的四个数取个有意义的别名就好了,一 ...

  9. Mybatis中注解@MapKey的使用

    在研究Mybatis源码之前并不知道这个注解的妙用的,但是当我看到参数解析的时候 有这个一个注解,所以我了解了一下,当我们返回像Map<String, Map<String, Object ...

  10. python打印进度条

    import sys,time第一种方法: for i in range(50): sys.stdout.write("#") time.sleep(0.1) sys.stdout ...