Java语言:79:通过反射获取成员变量并使用

1、概述:

类Field: 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。


A:获得类的成员变量 数组:

  1、getFields(公共类

  2、getDeclaredFields(所有类型的)

B:获得类的单个成员变量:

  1、getField (公共类的)

  2、getDeclaredField (所有类型的)

2、简单举例:

package Reflect;


import java.lang.reflect.Constructor;
import java.lang.reflect.Field;


public class Reflect_member {
public static void main(String[] args) throws Exception {
// 1)获取Person类字节码文件对象
@SuppressWarnings("rawtypes")
Class c = Class.forName("Reflect.Person");

// 2)获取构造方法对象
@SuppressWarnings({ "rawtypes", "unchecked" })
Constructor con = c.getConstructor();
Object obj = con.newInstance();

// 3)获取Filed类对象(address)
// public Field getField(String name):获取的是公共的字段
// 参数name:表示当前字段的名称

Field field = c.getField("address");
// 4)public void set(Object obj,Object value)
// 参数1:表示给哪个对象设置当前字段的值
// 参数2:表示给当前获取的哪个Field对象的字段设置一个新的值
field.set(obj, "北京");
System.out.println(obj);

// 5)给name字段赋值
// public Field getDeclaredField(String name):指定的字段
Field nameField = c.getDeclaredField("name")

// 6)因为是私有,应该取消Java语言访问检查(name)
nameField.setAccessible(true);
nameField.set(obj, "张三");
System.out.println(obj);



// 7)给age字段赋值
Field ageField = c.getDeclaredField("age");
ageField.setAccessible(true);
ageField.set(obj, 27);

System.out.println(obj);

                //Person [name=张三, age=27, address=北京]

}
}

                 Person类:

            package Reflect;


public class Person {
@SuppressWarnings("unused")
public String name;
@SuppressWarnings("unused")
private int age;
@SuppressWarnings("unused")
private String address;


public Person(String name, int age, String address) {
super();
this.name = name;
this.age = age;
this.address = address;
}


public Person() {
super();
}


// 带有一个参数的构造方法
@SuppressWarnings("unused")
private Person(String name) {
this.name = name;
}


// 无权限修饰符的带有两个参数的构造方法
public Person(int age, String address) {
this.age = age;
this.address = address;
}


// 无返回值的无参构造
public void show() {
System.out.println("show person");
}


// 无返回值的有参构造
public void method(String s) {
System.out.println("method" + s);
}


// 有参有返回值的
public String getString(String s, int i) {
return s + i;
}


// 私有的
@SuppressWarnings("unused")
private void function() {
System.out.println("function person");
}


@Override
public String toString() {


return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";
}


}

猜你喜欢

转载自blog.csdn.net/qq_41833394/article/details/80625940