Java反射入門(隨時更新)

    Java反射機制指的是在程序運行時,對於任何一個類,都可以知道這個類的屬性和方法。對於任何一個對象,都可以任意調用他的任意方法和屬性。這增加了java語言的動態性。

   說白了就是程序可以在運行時查看自己的狀態和行爲,並且根據狀態和行爲進行及時的調整,使程序運行的更加靈活。

   Java反射機制主要提供了一下幾種功能:

  • 在運行時判斷任意一個對象所屬的類。
  • 在運行時創建一個類的對象
  • 在運行時判斷任意一個類的成員變量和方法
  • 在運行時調用任意一個對象的方法



       1. 反射的作用:

           1.反編譯:.class->.java

           2.訪問類的方法,屬性,構造方法

       2.java中反射相關的類:

           1.java.lang.Class;               

           2.java.lang.reflect.Constructor;

           3.java.lang.reflect.Field;       

           4.java.lang.reflect.Method;

           5.java.lang.reflect.Modifier;

      3.反射的具體實現方法,假設是Employe類型:

//第一種方式:
Classc1 = Class.forName("Employee");
//第二種方式:
//java中每個類型都有class 屬性.
Classc2 = Employee.class;
 
//第三種方式:
//java語言中任何一個java對象都有getClass 方法
Employeee = new Employee();
Classc3 = e.getClass(); //c3是運行時類 (e的運行時類是Employee)
   Class對象可以獲得該類裏的方法(由method對象表示),構造器(由Constructor對象表示)、成員變量(由Field)對象表示,這三個類都位於java.lang.reflect包下並實現了java.lang.reflect.Member接口。程序可以通過Method對象來執行對應的方法,通過Constructor對象來調用對應的構造器創建實例,能通過Field對象直接訪問並修改對象的成員變量值。

    

創建實例對象

通過反射來生成實例對象有如下兩種方式。

  • 1.使用Class對象的newInstance()方法來創建該Class對應類的實例,這種方式要求該Class對象的對應類有默認構造器,而執行newInstance()時實際上是利用默認構造器來創建該類的實例。

    代碼示例:Class clazz=Person.class;
    Object obj=clazz.newInstance();

  • 2.先使用Class對象獲取指定的Constructor對象,再調用Constructor對象的newInstance()方法來創建該Class對象對應類的實例。通過這種方式可以選擇使用指定的構造器來創建實例。

    代碼示例:Class clazz=Person.class;
    Constructor constructor=clazz.getConstructor(String.class);
    Object obj=constructor.newInstance();



 
獲取屬性:分爲所有的屬性和指定的屬性:
先看獲取所有的屬性的寫法

package jdbc1101;
//獲取某個類的全部屬性
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class TestModifier {

	public static void main(String[] args) throws ClassNotFoundException {
		//獲取整個類
		Class<?> c = Class.forName("java.lang.Integer");
	      //獲取所有的屬性?
		Field[] fs = c.getDeclaredFields();
 
               //定義可變長的字符串,用來存儲屬性
		StringBuffer sb = new StringBuffer();
        //通過追加的方法,將每個屬性拼接到此字符串中
		//最外邊的public定義
		sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n");
        //裏邊的每一個屬性
		for(Field field:fs){
			sb.append("\t");//空格
			sb.append(Modifier.toString(field.getModifiers())+" ");//獲得屬性的修飾符,例如public,static等等
			sb.append(field.getType().getSimpleName() + " ");//屬性的類型的名字
			sb.append(field.getName()+";\n");//屬性的名字+回車
		}

		sb.append("}");

		System.out.println(sb);


	}

}

  b,獲取特定的屬性,對比着傳統的方法來學習:
package jdbc1101;
//獲取特定的屬性,設置私有的屬性
import java.lang.reflect.Field;
import java.util.Date;

public class Test {

	public static void main(String[] args) throws Exception{
							
			//獲取類
			Class c =Dog.class;
			//獲取id屬性
			Field idF = c.getDeclaredField("id");
			//實例化這個類賦給o
			Object o = c.newInstance();
			//打破封裝
			idF.setAccessible(true); //使用反射機制可以打破封裝性,導致了java對象的屬性不安全。
			//給o對象的id屬性賦值"110"
			idF.set(o,110); //set
			//get
			System.out.println(idF.get(o));
		}

}


    


          


    

  



  

  

發佈了36 篇原創文章 · 獲贊 4 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章