1. 程式人生 > >Java 反射機制的應用例項

Java 反射機制的應用例項

Java 反射機制的應用例項

1. Java Reflection

  1. Reflection(反射)是被視為動態語言的關鍵,反射機制允許程式在執行期間藉助於Reflection API取得任何類的內部資訊,並能直接操作任意物件的內部屬性和方法

2. Java 反射機制提供的功能

  1. 在執行時判斷任意一個物件所屬的類
  2. 在執行時構造任意一個類的物件
  3. 在執行時判斷任意一個類所具有成員變數和方法
  4. 在執行時呼叫任意一個物件的成員變數和方法
  5. 生成動態代理

3. Java反射機制研究及應用

  1. java.lang.Class:代表一個類
  2. java.lang.reflect.Method:代表類的方法
  3. java.lang.reflect.Field:代表類的成員變數
  4. java.lang.reflect.Constructor:代表類的構造方法
  5. 等。。。

4. dome

public class TestReflection {
	
	//有了反射,可以通過反射建立一個類物件,並呼叫其中的結構
	@Test
	public void test2() throws Exception {
		Class<Person> clazz = Person.class;
		
		//1.建立clazz對應的執行時類Person類的物件
		Person p = clazz.newInstance();
		System.out.println(p);// null 0 
		//2.通過反射呼叫執行時類的指定屬性
		//2.1
		Field f1 = clazz.getField("name");
		f1.set(p, "LiuDeHua");
		System.out.println(p);//Person [name=LiuDeHua, age=0]
		
//		Field f2 = clazz.getField("age");//java.lang.NoSuchFieldException: age,如果age的許可權修飾符不為public
//		f2.set(p, 30);
//		System.out.println(p);
		//2.2
		Field f2 = clazz.getDeclaredField("age");
		f2.setAccessible(true);//修改set的許可權,如沒有修改,會報沒有許可權的錯誤
		f2.set(p, 30);
		System.out.println(p);//Person [name=LiuDeHua, age=30]
		
		//通過反射呼叫執行時類的指定方法
		Method m1 = clazz.getMethod("show");//方法名和引數確定一個方法
		m1.invoke(p);
		
		Method m2 = clazz.getMethod("display", String.class);
		m2.invoke(p, "HK");
	}
	
	//在有反射以前,如果建立一個類的物件,並呼叫其中的方法、屬性
	@Test
	public void test1() {
		Person p = new Person();
		p.setAge(20);
		p.setName("Tom");
		System.out.println(p);
		p.show();
		p.display("US");
	}
}

public class Person {
	//2.開啟一許可權
	public  String name ;
	private int age;
	public Person() {
		super();
	}
	public Person(String name, int age) {
		super();
		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;
	}
	public void show () {
		System.out.println("我是一個人");
	}
	public void display(String nation) {
		System.out.println("我的國籍是:" + nation);
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
}
  1. 輸出
    輸出