java getfield_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

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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 的反射 API 中,getField 和 getDeclaredField 方法都可以用来获取类的字段对象,但它们有以下两个主要的区别: 1.访问权限:getField 方法只能获取到类中的 public 字段,而 getDeclaredField 方法可以获取到类中所有的字段,包括 public、protected、default 和 private 字段。 2.继承性:getField 方法只能获取到类本身和其父类中的 public 字段,而 getDeclaredField 方法只能获取到类本身声明的所有字段,不能获取其父类中的字段。 下面是一个示例代码,演示了 getField 和 getDeclaredField 方法的区别: ```java class Parent { public int publicField; protected int protectedField; int defaultField; private int privateField; } class Child extends Parent { public int childField; } public class Main { public static void main(String[] args) throws Exception { Class<Child> childClass = Child.class; // 使用 getField 获取 public 字段 Field publicField = childClass.getField("publicField"); System.out.println(publicField); // 使用 getDeclaredField 获取 public/protected/default/private 字段 Field protectedField = childClass.getDeclaredField("protectedField"); System.out.println(protectedField); Field defaultField = childClass.getDeclaredField("defaultField"); System.out.println(defaultField); Field privateField = childClass.getDeclaredField("privateField"); System.out.println(privateField); // 使用 getField 获取继承来的 public 字段 Field parentPublicField = childClass.getField("childField"); System.out.println(parentPublicField); } } ``` 在上面的示例代码中,Child 继承自 Parent 类,Parent 类中有四个字段,分别是 publicField、protectedField、defaultField 和 privateField。Child 类中有一个字段 childField。 我们可以看到,使用 getField 方法只能获取到 publicField 字段,而使用 getDeclaredField 方法可以获取到所有的字段。此外,使用 getField 方法也可以获取到 childField 字段,因为该字段是从父类继承而来的 public 字段。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值