java 反射 field.set,java 反射之Field

3a82da09c74e

image.png

一眼望不到头的隔壁滩,还有站在山头望着那边的山头,山那边的山是什么样的,很明显不得而知,而我的思绪却早已飞到了山那边的山,抬头便是晴空万里,白天哼着小曲,放着羊,夕阳西下的场景,不知不觉得浮现出小时候的场景,记得那时,晚饭过后,躺在父亲的怀里,一颗星星、二颗、三颗......咳咳,思绪又回来了,了解完method我们来看看filed(字段),那么如何获取filed?

获取Filed的方式:

> 1.public Filed[] getFileds();表示返回该对象字节码所表示类的能够访问的所有公共字段。

2.public Filed[] getDeclaredFileds();表示返回该字节码对象所表示类的所有字段(没有访问权限的限制),代码如下:

代码示例:

class Teacher{

public String name;

private int id;

private int age;

public Teacher(String name, int id, int age) {

this.name = name;

this.id = id;

this.age = age;

}

public Teacher() {

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

}

为了能够更好地理解,在这里我写了一个Teacher类,我们接着来看:

代码示例:

private static void getAllField(){

获取该字段所对应类的字节码

Class clazz = Teacher.class;

获取所有的公共的字段

Field[] fields = clazz.getFields();

System.out.println(fields.length);

for (Field f:fields) {

System.out.println(f);

}

System.out.println("=============================");

获取所有的字段,与访问权限无关

fields = clazz.getDeclaredFields();

System.out.println(fields.length);

for (Field f1:fields) {

System.out.println(f1);

}

}

测试结果如下:

3a82da09c74e

QQ截图20180505205741.png

由上图可知,我们拿到了该类的所有字段,上面我们只是拿到了所有的字段,在实际中我们可能只需要其中某一个,所以不必要都拿到,通过API我们可以发现,我们可以单独的拿到我们想要的那个字段,直接上代码:

> 1.public Filed getFiled(String name);表示返回一个Filed对象,而且是一个公共的可访问的字段,参数:name表示字段名。

2.public Filed getDeclaredFiled(String name);表示返回一个Filed对象,与访问权限无关

代码示例:

获取单个字段

private static void getOneField()throws Exception{

Teacher th = new Teacher();

th.setName("张三");

th.setAge(18);

th.setId(1001);

Class clazz = Teacher.class;

获取修饰符为公共的字段

Field field = clazz.getField("name");

给该字段设置新值

field.set(th,"哈哈");

System.out.println( field.get(th));

返回该字段的修饰符

System.out.println(field.getModifiers());

返回该字段名称

System.out.println(field.getName());

System.out.println(field.toString());

System.out.println("===================");

获取修饰符私有的字段

private int id

获取该字段,与访问权限无关

field = clazz.getDeclaredField("id");

设置允许访问私有的字段

field.setAccessible(true);

设置新的值

field.set(th,1111);

System.out.println(field.get(th));

System.out.println(field.getName());

System.out.println(field.getModifiers());

System.out.println(field.toString());

返回该字段的声明类型

System.out.println(field.getType());

System.out.println("=====================");

获取该 private int age

field = clazz.getDeclaredField("age");

field.setAccessible(true);

field.set(th,60);

System.out.println(field.get(th));

System.out.println(field.getName());

System.out.println(field.getModifiers());

System.out.println(field.toString());

}

从代码中我们得知,通过get(Object obj)获取属性的值,通过set(Object obj,value)重新设置新的属性值,并且当我们需要获取私有属性的属性值得时候,我们必须设置Accessible为true,然后才能获取。

测试结果:

3a82da09c74e

QQ截图20180505212409.png

关于反射的常见操作基本都在这里,总之了,多多练习,有句话说得好,多读源代码,对身体好,老铁们你们懂得了!!!!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值