java中的反射機制及其它知識點

反射是java提供的一種特殊處理機制,主要應用到框架開發中,常規用的不多。反射就是在運行狀態中,對於任意一個類,可以訪問類下的所有方法和屬性。對於任意一個對象,都能調用它的任意一個方法。多有的都是動態獲取的。

在java中,主要由以下幾類實現反射機制:

Class類:表示一個類
Field類:表示類的屬性
Method類:表示類的方法
Constructor:表示類的構造器

下圖可以簡單的說明這種關係。


1.clazz.getField("addr")中的getField方法只能獲取到public類型的屬性。而clazz.getDeclaredFields()則可以得到所有聲明的屬性。

2.構造反射類有三種方法。如TestBean是一個實體類。並且位於com.bjsxt.test包內。則有

①需放入try……catch中

Class clazz = Class.forName("com.bjsxt.test.TestBean");
②推薦第二種,簡單

Class clazz = TestBean.class;
③分步

TestBean tb = new TestBean();
Class clazz = tb.getClass();
查看輸出結果:
System.out.println(clazz.getName);//com.bjsxt.test.TestBean
System.out.println(clazz.getSimpleName);//TestBean
System.out.println(clazz.getPackage);//package com.bjsxt.test
3.invoke屬於反射中Method類,主要是用來調用類中的方法。invoke(class,method)。
invoke是在不知道具體的類的情況下,根據配置的字符串去調用一個類的方法。
可以舉個例子

import java.lang.reflect.Method;

public class InvokeTester {
    public int add(int param1, int param2) {
          return param1 + param2;
    }
 
    public String echo(String msg) {
 
          return "echo" + msg;
    }
    public static void main(String[] args) throws Exception {
          Class clazz = InvokeTester.class;
          Object obj = clazz.newInstance();
           
          Method addMethod = clazz.getMethod("add", new Class[] { int.class,int.class });
                     
//        Object result = addMethod.invoke(obj, new Object[] {new Integer(100), new Integer(200) });
          //在jdk5.0中有了裝箱 拆箱機制 new Integer(100)可以用100來代替,系統會自動在int 和integer之間轉換
          Object result = addMethod.invoke(obj, new Object[] {100, 200 });//兩種寫法效果相同

          System.out.println(result);
 
          Method echoMethod = clazz.getMethod("echo",new Class[] { String.class });
          result = echoMethod.invoke(obj, new Object[] { "hello"});
          System.out.println(result);
         }
}
結果爲:

300
echohello
注意Method調用方法時的寫法。

4.newInstance()和new有什麼區別?

①newInstance()是Class的一個方法,而new是java的一個關鍵字。
②newInstance()的使用有侷限,因爲它生成對象只能調用無參的構造方法,而new生成對象時沒有這個限制。用於反射。

因此在寫實體類時,最好寫上無參構造方法和有參的構造方法

Class.forName("");//返回的是類,
Class.forName("").newInstance();//返回的是object
5.setObject(int index,Object object)的用法
ps = conn.prepareStatement(sql);
ps.setObject(i+1,params[i]);//表示將數組param的第i個值賦給sql中的第i+1個問號,因爲數據庫中的下標從1開始。
還有類似的。

setString(1,"哈哈")表示給sql語句中的第一個"?"賦值爲字符串"哈哈",類似的setInt(2,4)表示對sql語句的第二個“?”賦值爲4

6.static修飾變量時,靜態變量會不依賴於堆內存,而放置在靜態存儲區。
堆內存中存放new出來的對象和數組。靜態存儲區存放靜態數據,全局變量還有常量。棧中存放函數內的變量,即局部變量,並且棧中的數據可以共享。

7.分頁
mysql分頁查詢語句爲:

select * from user limit startRow,pageSize;//startRow表示從數據庫哪一行開始查。
如數據庫有10條記錄

select * from user limit 0,10;//出10條結果,並且從第一條記錄開始
select * from user limit 1,10;//出9條結果,從第二條記錄開始查
所以雖然數據庫下標是從1開始,但還可以用0

8.父類的私有屬性(private),實際上子類也可以繼承,只是由於語法檢查不能對私有屬性進行訪問,這時可以用設置setAccessiable("true")來訪問私有屬性。

9.將雙線合併爲一條單線,可以使用

style = "border-collapse:collapse"
10. 代碼“${pageContext.request.contextPath}”的作用是取出部署的應用程序名,這樣不管如何部署,所用路徑都是正確的。 如原路徑爲:

“/images/title.gif”,改爲“${pageContext.request.contextPath}/images/title.gif”。

如新建了一個web project,名稱爲sxtwuye01 ,則使用${pageContext.request.contextPath }得到的名稱爲“/sxtwuye01”,包含斜槓

11.默認選中,<radio>可以用checked,<option>用selected

12.indexOf函數:查找字符串中指定字符或字符首次出現位置,並返回索引值。若找到索引值,就返回索引值位置;找不到就返回-1。


從0開始數。如果有重複的字符出現,以第一個字符爲準。

if(url.indexOf("?")!=-1){}//判斷url中是否包含"?",若url.indexOf("?")!=-1,說明包含"?".所以既使?出現在第一位,即indexOf後爲0,也會繼續執行

13.this:在java中式指向當前對象。在javascript總是指向當前函數的調用者。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章