field [fiːld] 领域的意思 这里是指成员对象
package com.itheima.d4_reflect_field;
import org.junit.Test;
import java.lang.reflect.Field;
/**
目标:反射_获取Field成员变量对象。
反射的第一步是先得到Class类对象。
1、Field getField(String name);
根据成员变量名获得对应Field对象,只能获得public修饰
2.Field getDeclaredField(String name);
根据成员变量名获得对应Field对象,只要申明了就可以得到
3.Field[] getFields();
获得所有的成员变量对应的Field对象,只能获得public的
4.Field[] getDeclaredFields();
获得所有的成员变量对应的Field对象,只要申明了就可以得到
小结:
获取全部成员变量:getDeclaredFields
获取某个成员变量:getDeclaredField
*/
public class FieldDemo01 {
/**
* 1.获取全部的成员变量。
* Field[] getDeclaredFields();
* 获得所有的成员变量对应的Field对象,只要申明了就可以得到
*/
@Test
public void getDeclaredFields(){
// a. 定位Class对象
Class c = Student.class;
// b.定位全部成员变量 getDeclaredFields返回的是一个Field[](成员对象)的数组
Field[] fields = c.getDeclaredFields(); // 拿到所有的成员对象
// c. 将成员对象遍历出来 (将成员数组遍历)
for (Field field : fields) {
System.out.println(field.getName() + "===>" + field.getType());
/**
* name===>class java.lang.String
* age===>int
* schoolName===>class java.lang.String
* COUNTTRY===>class java.lang.String
*/
}
}
/**
2.获取某个成员变量对象 Field getDeclaredField(String name);
*/
@Test
public void getDeclaredField() throws Exception {
// a. 定位class对象
Class c = Student.class;
// b. 根据名称定位某个成员变量
Field f = c.getDeclaredField("age"); // 获取成员名为 age的成员变量
System.out.println(f.getName() + "===> " + f.getType()); // age===> int
}
}
package com.itheima.d4_reflect_field;
import org.junit.Test;
import java.lang.reflect.Field;
/**
目标:反射获取成员变量: 取值和赋值。
Field的方法:给成员变量赋值和取值
void set(Object obj, Object value):给对象注入某个成员变量数据
Object get(Object obj):获取对象的成员变量的值。
void setAccessible(true);暴力反射,设置为可以直接访问私有类型的属性。
Class getType(); 获取属性的类型,返回Class对象。
String getName(); 获取属性的名称。
*/
public class FieldDemo02 {
@Test
public void setField() throws Exception{
// a. 反射第一步,获取类对象
Class c = Student.class;
// b. 提取某个成员变量
Field ageF = c.getDeclaredField("age");
// 由于该成员是私有的,所以要暴力打开权限(只许一次)
ageF.setAccessible(true);
// c. 赋值
Student s = new Student();
ageF.set(s,18); // 为 成员变量赋值
System.out.println(s);
// d. 取值 由于取到的值是Field类型的数据,要进行int强转
int age = (int) ageF.get(s);
System.out.println(age);
/**
* 无参数构造器执行!
* Student{name='null', age=18}
* 18
*/
}
}
package com.itheima.d4_reflect_field;
public class Student {
private String name;
private int age;
public static String schoolName;
public static final String COUNTTRY = "中国";
public Student(){
System.out.println("无参数构造器执行!");
}
public Student(String name, int age) {
System.out.println("有参数构造器执行!");
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}