機器學習賽事(四):快來一起挖掘幸福感
*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");