1. 程式人生 > 其它 >機器學習賽事(四):快來一起挖掘幸福感

機器學習賽事(四):快來一起挖掘幸福感

*1、反射機制有什麼用?(關係到後面的框架)*

​ 通過java語言中的反射機制可以操作位元組碼檔案,或者訪問位元組碼檔案。

​ 優點類似於黑客(可以讀和修改位元組碼檔案)

​ 通過反射機制可以操作程式碼片段(class檔案)

​ 作用:可以讓程式更加靈活。

*2、反射機制的相關類在哪個包下?*

​ java . lang . reflect .*

*3、反射機制相關的重要類有哪些?*

(重要)java.lang.Class 代表整個位元組碼,一個型別。代表整個類。

(重要)java.lang.reflect.Method 代表位元組碼中的方法位元組碼。代表類中的方法。

(重要)java.lang.reflect.Filed 代表位元組碼中的屬性位元組碼。代表類中的方法。

​ java.lang.reflect.Constructor 代表位元組碼中的構造方法位元組碼。代表類中的構造方法。

例如:	class Number{		       //Class

​		private int i=0;	       //Filed


​		public Number(int i) {      //Constructor
​			super();
​			this.i = i;
​		}

​		public Number() {
​			super();
​		}

​		public int getI() {		//Method
​			return i;
​		}

​		public void setI(int i) {
​		this.i = i;
​		}
​	}

*4、要操作一個類的位元組碼,首先要獲取這個 類 的位元組碼,怎麼獲取? java.lang.Calss*

*三種方式:*

***\*(1)第一種:Calss c1=Class.forName("完整類名帶包名");\****

​ Object obj=c1.newInstance(); //newInstance()方法底層呼叫了類c1的無引數構造方法,所以c1必須有無參構造。

​ forName()為靜態方法;

		方法的引數是一個字串;字串需要的是一個完整類名;

		完整類名必須帶包名,例如:java.lang.String

​ 使用forName()時,傳入的類會進行類載入

*(2)第二種:Class c2=物件引用.getClass();*

​ 例項方法;

​ 任何物件都有的方法;

***\*(3)第三種:Class c3=任何型別(包括基本資料型別).Class;\****

​ java中任何一種型別並且包括 基本資料型別,都有的.class屬性。

*5、如何獲取一個類檔案的絕對路徑?(死記)*

​ 下面的這種方式是通用,預設在src下查詢,前提是該檔案必須在類路徑(src)下:

*(1)方法一:先獲取檔案的絕對路徑*

String path=Thread.currentThread.getContextClassLoader().getResource("檔案相對src下的位置").getPath();

*(2)方法二:先獲取檔案的流(建議使用,不需要new io流了)*

InputStream inputStream=Thread.currentThread().getContextClassLoader().getResourceAsStream("檔案相對src下位置");

 

*(3)方法三:獲取資源繫結器(如果讀取properties檔案,建議使用)*

	ResourceBundle bundle=ResourceBundle.getBundle("properties檔案檔名");

​	String s=bundle.getString("key值");

​ 注意:上面的"properties檔名",不能有檔案型別字尾。例如,db.properties檔案,傳進去時寫成:“db”。

*6、如果只想讓一個類的靜態程式碼塊執行:*

​ Class.forName(“類路徑”);

​ 因為forName()方法會進行類載入。

*7、可變引數:*

型別…args 例:int…args String…args1 double…args2

注意:(一定是三個點, …)

1.可變長度引數要求的引數個數是:0~N個

2.可變長度引數在方法引數列表中必須在最後一個位置,並且方法引數列表中只有一個

3.可變引數長度可以當做一個數組來看待,也有length屬性

*8、通過反射機制訪問和修改屬性值*

​ 例:

​ (1)獲取Class位元組碼檔案

​ Class c1=Class.forName(“類路徑”);

​ (2)獲取類物件obj

​ Object obj=c1.newInstance();

​ (3)通過屬性名獲取屬性

​ Field no= c1.getDeclaredField(“no”); //getDeclaredFiled(“屬性名”)

​ (4)設定屬性值

​ 如果是私有屬性:

​ no.setAccessible(true); //打破私有封裝

​ no.set(obj, 141);

​ 如果不是私有屬性:

​ no.set(obj, 141);

​ (5)獲取屬性值

​ no.get(obj);

*9、通過反射機制呼叫方法:*

​ 例:

​ (1)獲取Class位元組碼檔案

		Class c1=Class.forName(“類路徑”);

​ (2)獲取類物件ljs

		Object ljs=c1.newInstance();

​ (3)通過反射機制獲取檔案中的方法:getDeclaredMethod(“方法名”,引數型別.class)

		Method login=c1.getDeclaredMethod("login", int.class,String.class);

​ (4)通過反射機制呼叫方法:invoke(物件名,引數值)

		Object value=login.invoke(ljs, 141,"ljs");

*10、通過反射機制呼叫構造方法:*

*呼叫無參構造*

例: (1)獲取Class位元組碼檔案

		Class c1=Class.forName(“類路徑”);

​ (2)獲取類物件ljs,呼叫無參構造

		Object ljs=c1.newInstance();

*呼叫有參構造*

例: (1)獲取Class位元組碼檔案

Class c1=Class.forName(“類路徑”);

 

​       Constructor c= c1.getDeclareConstructor(int.calss, String.class);

 

Object obj=c.newInstance(141,"ljs");