回忆(五):通过反射获取成员变量并使用

package reflex;

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

public class ReflectDemo05_getFields {
	/*
	 * 需求:通过反射获取成员变量并使用
	 * 
	 */
	public static void main(String[] args) throws Exception {
		// 获取字节码文件对象
		Class c = Class.forName("reflex.Person");

		// 获取所有的成员变量

		// 1.这种方法也只能返回所有的公有的public
		// Field[] fields = c.getFields();
		// public java.lang.String reflex.Person.address

		// 2.获取所有的还是需要Declare修饰的
		// Field[] fields = c.getDeclaredFields();
		// private java.lang.String reflex.Person.name
		// int reflex.Person.age
		// public java.lang.String reflex.Person.address

		// for (Field field : fields) {
		// System.out.println(field);
		// }
		
		
		/*
		 * 例如:
		 * 		Person p = new Person();
		 * 		p.address = "成都";
		 * 		sysout p
		 */
		
		// 通过无参构造方法创建对象
		Constructor con = c.getConstructor();
		Object obj = con.newInstance();
		
		// 获取单个的成员变量
		// 获取address并对其进行赋值
		
		// 获取单个的成员变量
		// 获取address并对其进行赋值
		Field addressField = c.getField("address");
		// public void set(Object obj, Object value)
		// throws IllegalArgumentException, IllegalAccessException
		// 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
		// 如果底层字段的类型为基本类型,则对新值进行自动解包。
		addressField.set(obj, "成都");
		System.out.println(obj);
		
		// declare
		// 获取name并对其赋值
		// NoSuchFieldException 私有的
		// Field nameField = c.getField("name");
		Field nameField = c.getDeclaredField("name");
		// 必须设置访问的属性,不然会报访问异常
		nameField.setAccessible(true);	
		nameField.set(obj, "mzy");
		System.out.println(obj);
		
		Field ageField = c.getDeclaredField("age");
		ageField.setAccessible(true);
		ageField.set(obj, 20);
		System.out.println(obj);
	}
}

其中的person:

package reflex;

public class Person {
	// 成员变量
	private String name;
	int age;
	public String address;

	// 构造方法
	public Person() {
	}

	Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
	private Person(String name) {
		this.name = name;
	}
	public Person(String name, int age, String address) {
		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;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";
	}

	private void function() {
		System.out.println("function");
	}

}


原文地址:https://www.cnblogs.com/mzywucai/p/11053446.html