1. 程式人生 > >Java反射的簡單實現

Java反射的簡單實現

一.Java的反射機制概述與場景

    JAVA反射機制是在執行狀態中,對於任意一個類(class檔案),都能夠知道這個類的所有屬性和方法;

對於任意一個物件,都能夠呼叫它的任意一個方法和屬性;

 這種動態互毆的資訊以及動態呼叫物件的方法的功能稱為java語言的反射機制

場景:tomcat中伺服器web.xml類檔案由反射進行載入

二.反射機制細節&class物件

獲得位元組碼物件的幾種方式

方式1:使用物件獲得 根據被new的累的名稱尋找累的位元組碼檔案,並載入進記憶體,並建立該位元組碼檔案對選哪個,並接著建立蓋子接檔案的對應的person物件

Person person = new Person();
		Class class1 = person.getClass();

方式2:使用類獲得

	Class class3 = Person.class;

方式3:使用名稱獲得

try {
			Class<?> forName = Class.forName("Person");
			System.out.println(forName);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

三.建立物件

    1.newInstance,相當於呼叫無參構造方法,注意:當無空參構造方法或者物件為private空參構造時,會報錯

Object newInstance = forName.newInstance();

 

2.獲取指定的建構函式

Class<?> forName = Class.forName("Person"); 
			Constructor<?> constructor = forName.getConstructor(Integer.class,String.class);
			Object obj = constructor.newInstance(1,"小明");

四.獲取屬性

    1.獲得公有屬性

Class<?> forName = Class.forName("Person"); 
			Constructor<?> constructor = forName.getConstructor(Integer.class,String.class);
			Object obj = constructor.newInstance(1,"小明");
			Field field = forName.getField("c");
			Object object = field.get(obj);

2.獲得私有的屬性

Class<?> forName = Class.forName("Person"); 
			Constructor<?> constructor = forName.getConstructor(Integer.class,String.class);
			Object obj = constructor.newInstance(1,"小明");
			
			Field declaredField = forName.getDeclaredField("a");
			declaredField.setAccessible(true);
			System.out.println(declaredField.get(obj));

注意:必須要取消許可權檢查才能訪問暴力訪問,不建議使用

五.獲取方法

1.獲得位元組物件所有的公有方法名稱

Class<?> forName = Class.forName("Person");
			Method[] methods = forName.getMethods();

 

2.呼叫方法

Class<?> forName = Class.forName("Person");
			Method method = forName.getMethod("方法名稱",null);
			method.invoke("我們的實體類", "引數");