注:上面劃線的粗體字最好用Object methobj = cls.newInstance();來代替,原因很明顯如果這個類及方法事先都是清楚的也不需要用reflection了
假如一個程序在執行的某處的時候才知道需要執行某個方法,這個方法的名稱是在程序的運行過程中指定的 (例如,JavaBean 開發環境中就會做這樣的事),那么上面的程序演示了如何做到。上例中,getMethod 用于查找一個具有兩個整型參數且名為 add 的方法。找到該方法并創建了相應的 Method 對象之后,在正確的對象實例中執行它。執行該方法的時候,需要提供一個參數列表,這在上例中是分別包裝了整數 37 和 47 的兩個 Integer 對象。執行方法的返回的同樣是一個 Integer 對象,它封裝了返回值 84。
二、執行期創建新的對象
對于構造器,則不能像執行方法那樣進行,因為執行一個構造器就意味著創建了一個新的對象 (準確的說,創建一個對象的過程包括分配內存和構造對象)。所以,與上例最相似的例子如下:
三、改變字段(域)的值
reflection 的還有一個用處就是改變對象數據字段的值。reflection 可以從正在運行的程序中根據名稱找到對象的字段并改變它,下面的例子可以說明這一點:
%>
<%
DiskFileUpload fu = new DiskFileUpload();
// 設置允許用戶上傳文件大小,單位:字節
fu.setSizeMax(200*1024*1024);
// 設置最多只允許在內存中存儲的數據,單位:字節
fu.setSizeThreshold(maxPostSize);
// 設置一旦文件大小超過getSizeThreshold()的值時數據存放在硬盤的目錄
fu.setRepositoryPath("g:\\upload\\tmp\\");
//開始讀取上傳信息 得到所有文件
try{
List fileItems = fu.parseRequest(request);
}catch(FileUploadException e){
//這里異常產生的原因可能是用戶上傳文件超過限制、不明類型的文件等
//自己處理的代碼
}
%>
<%
// 依次處理每個上傳的文件
Iterator iter = fileItems.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
//忽略其他不是文件域的所有表單信息
if (!item.isFormField()) {
String name = item.getName();
long size = item.getSize();
String contentType = item.getContentType();
if((name==null||name.equals("")) && size==0)
continue;
%>
<%
//保存上傳的文件到指定的目錄
String[] names=StringUtils.split(name,"\\"); //對原來帶路徑的文件名進行分割
name = names[names.length-1];
item.write(new File(saveDirectory+ name));
}
}
%>
下面是其簡單的使用場景:
A、上傳項目只要足夠小,就應該保留在內存里。
B、較大的項目應該被寫在硬盤的臨時文件上。
C、非常大的上傳請求應該避免。
D、限制項目在內存中所占的空間,限制最大的上傳請求,并且設定臨時文件的位置。
可以根據具體使用用servlet來重寫,具體參數配置可以統一放置到一配置文件
try
{
aFilePath = getFilePath(request);
aFileName = getFileName(request);
response.setContentType(getContentType(aFileName) + "; charset=UTF-8");
response.setHeader("Content-disposition", "attachment; filename=" + aFileName);
in = new FileInputStream(aFilePath + aFileName); //讀入文件
out = response.getOutputStream();
out.flush();
int aRead = 0;
while((aRead = in.read()) != -1 & in != null)
{
out.write(aRead);
}
out.flush();
}
catch(Throwable e)
{
log.error("FileDownload doGet() IO error!",e);
}
finally
{
try
{
in.close();
out.close();
}
catch(Throwable e)
{
log.error("FileDownload doGet() IO close error!",e);
}
}
}
創建醒目的Header(調試時用)
public String createHeader( String title ) {
int width = 30;
String stars = StringUtils.repeat( "*", width);
String centered = StringUtils.center( title, width, "*" );
String heading = StringUtils.join(new Object[]{stars, centered, stars}, "\n");
return heading;
}
調用createHeader("TEST")的輸出結果:
******************************
************ TEST ************
******************************
字符的全部反轉及以單個詞為單位的反轉
String original = "In time, I grew tired of his babbling nonsense.";
StringUtils.reverse( original ) = ".esnesnon gnilbbab sih fo derit werg I ,emit nI"
以單個詞為單位的反轉
public Sentence reverseSentence(String sentence) {
String reversed = StringUtils.chomp( sentence, "." );
reversed = StringUtils.reverseDelimited( reversed, ' ' );
reversed = reversed + ".";
return reversed;
}
String sentence = "I am Susan."
reverseSentence( sentence ) ) = "Susan am I."
檢查字符串是否僅僅包含數字、字母或數字和字母的混合
String test1 = "ORANGE";
String test2 = "ICE9";
String test3 = "ICE CREAM";
String test4 = "820B Judson Avenue";
String test5 = "1976";
結果:
boolean t1val = StringUtils.isAlpha( test1 ); // returns true
boolean t2val = StringUtils.isAlphanumeric( test2 ); // returns true
boolean t3val = StringUtils.isAlphaSpace( test3 ); // returns true
boolean t4val = StringUtils.isAlphanumericSpace( test4 ); // returns true
boolean t5val = StringUtils.isNumeric( test5 ); // returns true
Map weights = ArrayUtils.toMap( weightArray );
Double hydrogenWeight = (Double)weights.get( "H" );
注意:當二維對象數組"key"值重復時,創建的Map,后面的鍵-值對會把前面的覆蓋掉