在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開始,但還可以用08.父類的私有屬性(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總是指向當前函數的調用者。