一眼望不到头的隔壁滩,还有站在山头望着那边的山头,山那边的山是什么样的,很明显不得而知,而我的思绪却早已飞到了山那边的山,抬头便是晴空万里,白天哼着小曲,放着羊,夕阳西下的场景,不知不觉得浮现出小时候的场景,记得那时,晚饭过后,躺在父亲的怀里,一颗星星、二颗、三颗......咳咳,思绪又回来了,了解完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<Teacher> 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);
}
}
测试结果如下:
由上图可知,我们拿到了该类的所有字段,上面我们只是拿到了所有的字段,在实际中我们可能只需要其中某一个,所以不必要都拿到,通过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<Teacher> 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,然后才能获取。
测试结果:
关于反射的常见操作基本都在这里,总之了,多多练习,有句话说得好,多读源代码,对身体好,老铁们你们懂得了!!!!