- 1. getFields() - 获取所有可访问的公共字段
- 2. getDeclaredFields() - 获取所有可访问的字段
- 3. getField(String name) - 获取指定公共字段
- 4. getDeclaredField(String name) - 获取指定字段
- 5. 利用反射给属性赋值
通过Class对象的getFields()或getField()方法可以获取该类所包括的全部Field或指定Field。Field提供了如下两组方法来读取或设置Field值。
- getXxx(Object obj):获取obj对象该Field的属性值。此处的Xxx对应8个基本类型,如果该属性的类型是引用类型,则取消get后面的Xxx。
- setXxx(Object obj,Xxx val):将obj对象的该Field设置成val值。此处的Xxx对应8个基本类型,如果该属性的类型是引用类型,则取消set后面的Xxx。
public class Person {
//私有的成员变量
private String name;
//默认的
int age;
//公共的
public String address;
public Person() {
super();
}
//没有用public修饰的构造方法
Person(int age, String address) {
super();
this.age = age;
this.address = address;
}
//私有的构造方法
private Person(String name) {
super();
this.name = name;
this.age = age;
}
//公共的构造方法
public Person(String name, int age, String address) {
super();
this.name = name;
this.age = age;
this.address = address;
}
public void show() {
System.out.println("show");
}
public void method(String s) {
System.out.println("method"+s);
}
public String getString(String s,int i) {
return s+"....."+i;
}
public void function() {
System.out.println("function");
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";
}
}
1. getFields() - 获取所有可访问的公共字段
Class 对象所表示的类或接口的所有可访问公共字段
public class Main {
public static void main(String[] args) throws ClassNotFoundException {
Class clazz = Class.forName("com.example.redislock.reflect.Person");
Field[] fields = clazz.getFields();
for (Field field : fields) {
System.out.println(field);
}
}
}
2. getDeclaredFields() - 获取所有可访问的字段
Class 对象所表示的类或接口所声明的所有字段
public class Main {
public static void main(String[] args) throws ClassNotFoundException {
Class clazz = Class.forName("com.example.redislock.reflect.Person");
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
System.out.println(field);
}
}
}
3. getField(String name) - 获取指定公共字段
Class 对象所表示的类或接口的指定公共成员字段
name表示属性名称
public class Main {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
Class clazz = Class.forName("com.example.redislock.reflect.Person");
Field address = clazz.getField("address");
System.out.println(address);
}
}
4. getDeclaredField(String name) - 获取指定字段
Class 对象所表示的类或接口的指定已声明字段
public class Main {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
Class clazz = Class.forName("com.example.redislock.reflect.Person");
Field name = clazz.getDeclaredField("name");
System.out.println(name);
}
}
5. 利用反射给属性赋值
public class Main {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException {
Class clazz = Class.forName("com.example.redislock.reflect.Person");
// 创建对应
Object obj = clazz.newInstance();
Field field = clazz.getDeclaredField("name");
// 因为name属性没有public修饰,取消权限检查
field.setAccessible(true);
// 给引用类型的字段赋值,给obj对象的nam字段赋值为zhangsan,其中obj对象就是Person对象
field.set(obj,"zhangsan");
// 获取obj对象字段的值
System.out.println(field.get(obj));
}
}



