??xml version="1.0" encoding="utf-8" standalone="yes"?>中文字幕日本不卡,国产99视频在线观看,久久夜精品香蕉http://www.aygfsteel.com/tangzurui/category/31601.htmlzh-cnFri, 01 Jul 2011 06:10:08 GMTFri, 01 Jul 2011 06:10:08 GMT60fckeditor 更改囄上传路径为绝对\?java-core-2.4.jar http://www.aygfsteel.com/tangzurui/archive/2011/06/29/353330.html梓枫梓枫Wed, 29 Jun 2011 02:19:00 GMThttp://www.aygfsteel.com/tangzurui/archive/2011/06/29/353330.htmlhttp://www.aygfsteel.com/tangzurui/comments/353330.htmlhttp://www.aygfsteel.com/tangzurui/archive/2011/06/29/353330.html#Feedback0http://www.aygfsteel.com/tangzurui/comments/commentRss/353330.htmlhttp://www.aygfsteel.com/tangzurui/services/trackbacks/353330.html
在网上找?jin)好久都没有扑ֈ完全解决q个问题的办法,只好自己试着L?br />目的是更改fckeditor的上传图片到另一个工E中Q避免每ơ更新项目版本时都要重新把附件拷贝一?br />

首先扑ֈfckeditor.properties
在其中加?br />

   #上传文g的绝对\?nbsp;(上传时用到的目录)

   connector.userFilesAbsolutePath = D:/temp/image

   #在web上用文件时的虚拟目?  Q读取图片时用到Q?/span>

   connector.userFilesPath = http://localhost:8080/temp 

  

更改ConnectorServletcM的doGet()Ҏ(gu)
  扑ֈ以下代码
//   String typePath = UtilsFile.constructServerSidePath(request, resourceType);
//   String typeDirPath = getServletContext().getRealPath(typePath);
    更改以上两行代码为:(x)
   String typePath=D:/temp/image;
   String typeDirPath =D:/temp/image;

doPost()Ҏ(gu)同doGetҎ(gu)一h改同L(fng)代码


三、找?font face="Verdana">fckeditor\editor\filemanager\browser\default\frmresourceslist.html文g
  扑ֈ以下代码:
   var sCurrentFolderPath = oFolderNode.attributes.getNamedItem('path').value ;
   var sCurrentFolderUrl = oFolderNode.attributes.getNamedItem('url').value ;
   再其下方增加
   var num = sCurrentFolderUrl.indexOf('http');
    sCurrentFolderUrl =sCurrentFolderUrl.substring(num,sCurrentFolderUrl.lenght);


四?nbsp; 扑ֈ文gfckeditor\editor\dialog\fck_image\fck_image.js
   更改Ҏ(gu):
   function OnUploadCompleted( errorNumber, fileUrl, fileName, customMsg ){}
   在switch ( errorNumber )q行代码上面增加以下代码Q?br />   var num = fileUrl.indexOf('http');
   fileUrl =fileUrl.substring(num,fileUrl.lenght);

===========this over .....


以上是更改为绝对\径的整个q程Q也许有更好的办法,期待其出?...



梓枫 2011-06-29 10:19 发表评论
]]>
Collections.sort() ?List 排序 http://www.aygfsteel.com/tangzurui/archive/2009/03/16/260115.html梓枫梓枫Mon, 16 Mar 2009 14:19:00 GMThttp://www.aygfsteel.com/tangzurui/archive/2009/03/16/260115.htmlhttp://www.aygfsteel.com/tangzurui/comments/260115.htmlhttp://www.aygfsteel.com/tangzurui/archive/2009/03/16/260115.html#Feedback1http://www.aygfsteel.com/tangzurui/comments/commentRss/260115.htmlhttp://www.aygfsteel.com/tangzurui/services/trackbacks/260115.html (tng)

class  (tng)User (tng){
 (tng)String (tng)name;
 (tng)String (tng)age;
 (tng)
 (tng)
public  (tng)User(String (tng)name,String (tng)age){
 (tng) (tng)
this .name = name;
 (tng) (tng)
this .age = age;
 (tng)}
 (tng)
public  (tng)String (tng)getAge() (tng){
 (tng) (tng)
return  (tng)age;
 (tng)}
 (tng)
public  (tng) void  (tng)setAge(String (tng)age) (tng){
 (tng) (tng)
this .age (tng) =  (tng)age;
 (tng)}
 (tng)
public  (tng)String (tng)getName() (tng){
 (tng) (tng)
return  (tng)name;
 (tng)}
 (tng)
public  (tng) void  (tng)setName(String (tng)name) (tng){
 (tng) (tng)
this .name (tng) =  (tng)name;
 (tng)} (tng)
}

public class SortTest { (tng)
public  (tng) static  (tng) void  (tng)main(String[] (tng)args){
 (tng) (tng)List (tng)userlist
= new  (tng)ArrayList();
 (tng) (tng)userlist.add(
new  (tng)User( " dd " , " 4 " ));
 (tng) (tng)userlist.add(
new  (tng)User( " aa " , " 1 " ));
 (tng) (tng)userlist.add(
new  (tng)User( " ee " , " 5 " ));
 (tng) (tng)userlist.add(
new  (tng)User( " bb " , " 2 " )); (tng) (tng)
 (tng) (tng)userlist.add(
new  (tng)User( " ff " , " 5 " ));
 (tng) (tng)userlist.add(
new  (tng)User( " cc " , " 3 " ));
 (tng) (tng)userlist.add(
new  (tng)User( " gg " , " 6 " ));
 (tng) (tng) (tng)
Collections.sort(userlist,
new  (tng)Comparator < User > (){
public  (tng) int  (tng)compare(User (tng)arg0, (tng)User (tng)arg1) (tng){
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)User (tng)user0
= (User)arg0;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)User (tng)user1
= (User)arg1;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
// 首先比较q龄Q如果年龄相同,则比较名?/span>
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) int  (tng)flag = user0.getAge().compareTo(user1.getAge());
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
if (flag == 0 ){
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
return  (tng)user0.getName().compareTo(user1.getName());
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)}
else {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
return  (tng)flag;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)} (tng) (tng)
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)}

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)});
 (tng) (tng) (tng)
 (tng) (tng)
for  (tng)( int  (tng)i = 0 ;i < userlist.size();i ++ ){
 (tng) (tng) (tng)User (tng)user_temp
= (User)userlist.get(i);
 (tng) (tng) (tng) (tng) (tng) (tng)System.out.println(user_temp.getAge()
+ " , " + user_temp.getName()); (tng)
 (tng) (tng)}
 (tng) (tng)
 (tng)}
}

 (tng)
// 首先比较q龄Q如果年龄相同,则比较名?/span>

l果:
 (tng) (tng) (tng)
1 , (tng)aa
 (tng) (tng) (tng)
2 , (tng)bb
 (tng) (tng) (tng)
3 , (tng)cc
 (tng) (tng) (tng)
4 , (tng)dd
 (tng) (tng) (tng)
5 , (tng)ee
 (tng) (tng) (tng)
5 , (tng)ff
 (tng) (tng) (tng)
6 , (tng)gg


梓枫 2009-03-16 22:19 发表评论
]]>
-------------格式化输?------------http://www.aygfsteel.com/tangzurui/archive/2009/03/02/257420.html梓枫梓枫Mon, 02 Mar 2009 14:00:00 GMThttp://www.aygfsteel.com/tangzurui/archive/2009/03/02/257420.htmlhttp://www.aygfsteel.com/tangzurui/comments/257420.htmlhttp://www.aygfsteel.com/tangzurui/archive/2009/03/02/257420.html#Feedback1http://www.aygfsteel.com/tangzurui/comments/commentRss/257420.htmlhttp://www.aygfsteel.com/tangzurui/services/trackbacks/257420.html  (tng)System.out.format("%b\n",new Date());

对于b(布尔cd)来说Q?/font>

如果?span style="COLOR: #ff0000">字符Q字W串Q数字,对象为trueQ?/font>

如果?span style="COLOR: #0000ff; BACKGROUND-COLOR: #ffffff">NULLQ则为FALSE



 (tng) (tng)System.out.format("%c\n",new Integer(50));

对于字符cd来说Q?/p>

只能是:(x)byteQ?intQ?shortQ字W?对应的包装类

其他的则报告错误

 (tng)


 (tng) (tng)System.out.printf("%d\n",new Long("99"));

对于整型数据来说Q?/p>

如下Q?span style="COLOR: #ff0000">byte short int long ?qing)?strong>包装c?/span>都可??span style="COLOR: #0000ff">float double 不可?/p>

 (tng)


 (tng) (tng)System.out.printf("%f\n",123.00)Q?/p>

对于点cd来说Q必Lfloat 或者是 double (tng) (tng) Q其他都不可?/p>

 (tng)


 (tng) (tng)System.out.format("%s",'p');

对于字符来说Q?span style="COLOR: #ff0000">字符Ԍ数字Q对?/strong>都可以。其实就是用字符串描q参?/p>

 (tng)



梓枫 2009-03-02 22:00 发表评论
]]>
String.split()http://www.aygfsteel.com/tangzurui/archive/2008/10/10/233548.html梓枫梓枫Fri, 10 Oct 2008 03:33:00 GMThttp://www.aygfsteel.com/tangzurui/archive/2008/10/10/233548.htmlhttp://www.aygfsteel.com/tangzurui/comments/233548.htmlhttp://www.aygfsteel.com/tangzurui/archive/2008/10/10/233548.html#Feedback1http://www.aygfsteel.com/tangzurui/comments/commentRss/233548.htmlhttp://www.aygfsteel.com/tangzurui/services/trackbacks/233548.html在应用中用到一些,l大家ȝ一下,仅供大家参考:(x)
1、如果用?”作为分隔的话,必须是如下写法:(x)String.split("\\."),q样才能正确的分隔开Q不能用String.split(".");
2、如果用“|”作为分隔的话,必须是如下写法:(x)String.split("\\|"),q样才能正确的分隔开Q不能用String.split("|");
?”和“|”都是{义字W,必须得加"\\";
3、如果在一个字W串中有多个分隔W,可以用“|”作字符Q比如:(x)“acount=? and uu =? or n=??把三个都分隔出来Q可以用String.split("and|or");

梓枫 2008-10-10 11:33 发表评论
]]>
JAVA反射机制http://www.aygfsteel.com/tangzurui/archive/2008/08/11/221247.html梓枫梓枫Mon, 11 Aug 2008 03:23:00 GMThttp://www.aygfsteel.com/tangzurui/archive/2008/08/11/221247.htmlhttp://www.aygfsteel.com/tangzurui/comments/221247.htmlhttp://www.aygfsteel.com/tangzurui/archive/2008/08/11/221247.html#Feedback0http://www.aygfsteel.com/tangzurui/comments/commentRss/221247.htmlhttp://www.aygfsteel.com/tangzurui/services/trackbacks/221247.html (tng) (tng) (tng) (tng)JAVA反射机制是在q行状态中Q对于Q意一个类Q都能够知道q个cȝ所有属性和Ҏ(gu)Q对于Q意一个对象,都能够调用它的Q意一个方法;q种动态获取的信息以及(qing)动态调用对象的Ҏ(gu)的功能称为java语言的反机制?br />Java反射机制主要提供?jin)以下功能?x) (tng)在运行时判断L一个对象所属的c;在运行时构造Q意一个类的对象;在运行时判断L一个类所h的成员变量和Ҏ(gu)Q在q行时调用Q意一个对象的Ҏ(gu)Q生成动态代理?br />1. (tng)得到某个对象的属?br />
1 (tng)public (tng)Object (tng)getProperty(Object (tng)owner, (tng)String (tng)fieldName) (tng)throws (tng)Exception (tng){
2 (tng) (tng) (tng) (tng) (tng)Class (tng)ownerClass (tng)= (tng)owner.getClass();
3 (tng)
4 (tng) (tng) (tng) (tng) (tng)Field (tng)field (tng)= (tng)ownerClass.getField(fieldName);
5 (tng)
6 (tng) (tng) (tng) (tng) (tng)Object (tng)property (tng)= (tng)field.get(owner);
7 (tng)
8 (tng) (tng) (tng) (tng) (tng)return (tng)property;
9 (tng)}
Class (tng)ownerClass (tng)= (tng)owner.getClass()Q得到该对象的Class?br />
Field (tng)field (tng)= (tng)ownerClass.getField(fieldName)Q通过Class得到cd明的属性?br />
Object (tng)property (tng)= (tng)field.get(owner)Q通过对象得到该属性的实例Q如果这个属性是非公有的Q这里会(x)报IllegalAccessException?br />
2. (tng)得到某个cȝ?rn)态属?br />
 (tng)1 (tng)public (tng)Object (tng)getStaticProperty(String (tng)className, (tng)String (tng)fieldName)
 (tng)2 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)throws (tng)Exception (tng){
 (tng)3 (tng) (tng) (tng) (tng) (tng)Class (tng)ownerClass (tng)= (tng)Class.forName(className);
 (tng)4 (tng)
 (tng)5 (tng) (tng) (tng) (tng) (tng)Field (tng)field (tng)= (tng)ownerClass.getField(fieldName);
 (tng)6 (tng)
 (tng)7 (tng) (tng) (tng) (tng) (tng)Object (tng)property (tng)= (tng)field.get(ownerClass);
 (tng)8 (tng)
 (tng)9 (tng) (tng) (tng) (tng) (tng)return (tng)property;
10 (tng)}

Class (tng)ownerClass (tng)= (tng)Class.forName(className) (tng)Q首先得到这个类的Class?br />
Field (tng)field (tng)= (tng)ownerClass.getField(fieldName)Q和上面一P通过Class得到cd明的属性?br />
Object (tng)property (tng)= (tng)field.get(ownerClass) (tng)Q这里和上面有些不同Q因属性是?rn)态的Q所以直接从cȝClass里取?br />
3. (tng)执行某对象的Ҏ(gu)

 (tng)1 (tng)public (tng)Object (tng)invokeMethod(Object (tng)owner, (tng)String (tng)methodName, (tng)Object[] (tng)args) (tng)throws (tng)Exception (tng){
 (tng)2 (tng)
 (tng)3 (tng) (tng) (tng) (tng) (tng)Class (tng)ownerClass (tng)= (tng)owner.getClass();
 (tng)4 (tng)
 (tng)5 (tng) (tng) (tng) (tng) (tng)Class[] (tng)argsClass (tng)= (tng)new (tng)Class[args.length];
 (tng)6 (tng)
 (tng)7 (tng) (tng) (tng) (tng) (tng)for (tng)(int (tng)i (tng)= (tng)0, (tng)j (tng)= (tng)args.length; (tng)i (tng)< (tng)j; (tng)i++) (tng){
 (tng)8 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)argsClass[i] (tng)= (tng)args[i].getClass();
 (tng)9 (tng) (tng) (tng) (tng) (tng)}
10 (tng)
11 (tng) (tng) (tng) (tng) (tng)Method (tng)method (tng)= (tng)ownerClass.getMethod(methodName, (tng)argsClass);
12 (tng)
13 (tng) (tng) (tng) (tng) (tng)return (tng)method.invoke(owner, (tng)args);
14 (tng)}
Class (tng)owner_class (tng)= (tng)owner.getClass() (tng)Q首先还是必d到这个对象的Class?br />
5?行:(x)配置参数的Class数组Q作为寻找Method的条件?br />
Method (tng)method (tng)= (tng)ownerClass.getMethod(methodName, (tng)argsClass)Q通过Method名和参数的Class数组得到要执行的Method?br />
method.invoke(owner, (tng)args)Q执行该MethodQinvokeҎ(gu)的参数是执行q个Ҏ(gu)的对象,和参数数l。返回值是ObjectQ也既是该方法的q回倹{?br />
4. (tng)执行某个cȝ?rn)态方?br />
 (tng)1 (tng)public (tng)Object (tng)invokeStaticMethod(String (tng)className, (tng)String (tng)methodName,
 (tng)2 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)Object[] (tng)args) (tng)throws (tng)Exception (tng){
 (tng)3 (tng) (tng) (tng) (tng) (tng)Class (tng)ownerClass (tng)= (tng)Class.forName(className);
 (tng)4 (tng)
 (tng)5 (tng) (tng) (tng) (tng) (tng)Class[] (tng)argsClass (tng)= (tng)new (tng)Class[args.length];
 (tng)6 (tng)
 (tng)7 (tng) (tng) (tng) (tng) (tng)for (tng)(int (tng)i (tng)= (tng)0, (tng)j (tng)= (tng)args.length; (tng)i (tng)< (tng)j; (tng)i++) (tng){
 (tng)8 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)argsClass[i] (tng)= (tng)args[i].getClass();
 (tng)9 (tng) (tng) (tng) (tng) (tng)}
10 (tng)
11 (tng) (tng) (tng) (tng) (tng)Method (tng)method (tng)= (tng)ownerClass.getMethod(methodName, (tng)argsClass);
12 (tng)
13 (tng) (tng) (tng) (tng) (tng)return (tng)method.invoke(null, (tng)args);
14 (tng)}

基本的原理和实例3相同Q不同点是最后一行,invoke的一个参数是nullQ因是静(rn)态方法,不需要借助实例q行?br />
5. (tng)新徏实例
 (tng)1 (tng)
 (tng)2 (tng)public (tng)Object (tng)newInstance(String (tng)className, (tng)Object[] (tng)args) (tng)throws (tng)Exception (tng){
 (tng)3 (tng) (tng) (tng) (tng) (tng)Class (tng)newoneClass (tng)= (tng)Class.forName(className);
 (tng)4 (tng)
 (tng)5 (tng) (tng) (tng) (tng) (tng)Class[] (tng)argsClass (tng)= (tng)new (tng)Class[args.length];
 (tng)6 (tng)
 (tng)7 (tng) (tng) (tng) (tng) (tng)for (tng)(int (tng)i (tng)= (tng)0, (tng)j (tng)= (tng)args.length; (tng)i (tng)< (tng)j; (tng)i++) (tng){
 (tng)8 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)argsClass[i] (tng)= (tng)args[i].getClass();
 (tng)9 (tng) (tng) (tng) (tng) (tng)}
10 (tng)
11 (tng) (tng) (tng) (tng) (tng)Constructor (tng)cons (tng)= (tng)newoneClass.getConstructor(argsClass);
12 (tng)
13 (tng) (tng) (tng) (tng) (tng)return (tng)cons.newInstance(args);
14 (tng)
15 (tng)}

q里说的Ҏ(gu)是执行带参数的构造函数来新徏实例的方法。如果不需要参敎ͼ可以直接使用newoneClass.newInstance()来实现?br />
Class (tng)newoneClass (tng)= (tng)Class.forName(className)Q第一步,得到要构造的实例的Class?br />
W?~第9行:(x)得到参数的Class数组?br />
Constructor (tng)cons (tng)= (tng)newoneClass.getConstructor(argsClass)Q得到构造子?br />
cons.newInstance(args)Q新建实例?br />
6. (tng)判断是否为某个类的实?br />
1 (tng)public (tng)boolean (tng)isInstance(Object (tng)obj, (tng)Class (tng)cls) (tng){
2 (tng) (tng) (tng) (tng) (tng)return (tng)cls.isInstance(obj);
3 (tng)}

7. (tng)得到数组中的某个元素
1 (tng)public (tng)Object (tng)getByArray(Object (tng)array, (tng)int (tng)index) (tng){
2 (tng) (tng) (tng) (tng) (tng)return (tng)Array.get(array,index);
3 (tng)}


梓枫 2008-08-11 11:23 发表评论
]]>
servlet中配|文件web.xml中的参数context-param和init-param?/title><link>http://www.aygfsteel.com/tangzurui/archive/2008/07/29/218469.html</link><dc:creator>梓枫</dc:creator><author>梓枫</author><pubDate>Tue, 29 Jul 2008 08:32:00 GMT</pubDate><guid>http://www.aygfsteel.com/tangzurui/archive/2008/07/29/218469.html</guid><wfw:comment>http://www.aygfsteel.com/tangzurui/comments/218469.html</wfw:comment><comments>http://www.aygfsteel.com/tangzurui/archive/2008/07/29/218469.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/tangzurui/comments/commentRss/218469.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/tangzurui/services/trackbacks/218469.html</trackback:ping><description><![CDATA[ <table style="TABLE-LAYOUT: fixed"> <tbody> <tr> <td> <div id="wmqeeuq" class="cnt" id="blog_text">web.xml里面可以定义两种参数Q?br />(1)application范围内的参数Q存攑֜servletcontext中,在web.xml中配|如下:(x) <div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span></span><span><</span><span>context-param</span><span>></span><span><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)</span><span><</span><span>param-name</span><span>></span><span>context/param</span><span></</span><span>param-name</span><span>></span><span><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)</span><span><</span><span>param-value</span><span>></span><span>avalible during application</span><span></</span><span>param-value</span><span>></span><span><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> (tng) (tng)</span><span></</span><span>context-param</span><span>></span></div></div><p>(2)servlet范围内的参数Q只能在servlet的init()Ҏ(gu)中取得,在web.xml中配|如下:(x)</p><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span></span><span><</span><span>servlet</span><span>></span><span><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> (tng) (tng) (tng) (tng)</span><span><</span><span>servlet-name</span><span>></span><span>MainServlet</span><span></</span><span>servlet-name</span><span>></span><span><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> (tng) (tng) (tng) (tng)</span><span><</span><span>servlet-class</span><span>></span><span>com.wes.controller.MainServlet</span><span></</span><span>servlet-class</span><span>></span><span><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> (tng) (tng) (tng) (tng)</span><span><</span><span>init-param</span><span>></span><span><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng)</span><span><</span><span>param-name</span><span>></span><span>param1</span><span></</span><span>param-name</span><span>></span><span><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng)</span><span><</span><span>param-value</span><span>></span><span>avalible in servlet init()</span><span></</span><span>param-value</span><span>></span><span><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> (tng) (tng) (tng) (tng)</span><span></</span><span>init-param</span><span>></span><span><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> (tng) (tng) (tng) (tng)</span><span><</span><span>load-on-startup</span><span>></span><span>0</span><span></</span><span>load-on-startup</span><span>></span><span><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span></</span><span>servlet</span><span>></span></div></div><p>在servlet中可以通过代码分别取用Q?br /><br /><span></span></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> (tng)com.wes.controller;<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> (tng)javax.servlet.ServletException;<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> (tng)javax.servlet.http.HttpServlet;<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_156_541_Open_Image" onclick="this.style.display='none'; Codehighlighter1_156_541_Open_Text.style.display='none'; Codehighlighter1_156_541_Closed_Image.style.display='inline'; Codehighlighter1_156_541_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_156_541_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_156_541_Closed_Text.style.display='none'; Codehighlighter1_156_541_Open_Image.style.display='inline'; Codehighlighter1_156_541_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> (tng)</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> (tng)MainServlet (tng)</span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000"> (tng)HttpServlet (tng)</span><span id="Codehighlighter1_156_541_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_156_541_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_187_212_Open_Image" onclick="this.style.display='none'; Codehighlighter1_187_212_Open_Text.style.display='none'; Codehighlighter1_187_212_Closed_Image.style.display='inline'; Codehighlighter1_187_212_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_187_212_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_187_212_Closed_Text.style.display='none'; Codehighlighter1_187_212_Open_Image.style.display='inline'; Codehighlighter1_187_212_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> (tng) (tng) (tng) (tng)</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> (tng)MainServlet() (tng)</span><span id="Codehighlighter1_187_212_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_187_212_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)</span><span style="COLOR: #0000ff">super</span><span style="COLOR: #000000">();<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng)}</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_264_539_Open_Image" onclick="this.style.display='none'; Codehighlighter1_264_539_Open_Text.style.display='none'; Codehighlighter1_264_539_Closed_Image.style.display='inline'; Codehighlighter1_264_539_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_264_539_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_264_539_Closed_Text.style.display='none'; Codehighlighter1_264_539_Open_Image.style.display='inline'; Codehighlighter1_264_539_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> (tng) (tng) (tng) (tng)</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> (tng)</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> (tng)init() (tng)</span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> (tng)ServletException (tng)</span><span id="Codehighlighter1_264_539_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_264_539_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">下面的两个参数param1是在servlet中存攄</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)System.out.println(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.getInitParameter(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">param1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">下面的参数是存放在servletcontext中的</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)System.out.println(getServletContext().getInitParameter(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">context/param</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng)}</span></span><span style="COLOR: #000000"><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /></span></div><p><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></p><p>W一U参数在servlet里面可以通过getServletContext().getInitParameter("context/param")得到<br />W二U参数只能在servlet的init()Ҏ(gu)中通过this.getInitParameter("param1")?/p></div> </td> </tr> </tbody> </table> <img src ="http://www.aygfsteel.com/tangzurui/aggbug/218469.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/tangzurui/" target="_blank">梓枫</a> 2008-07-29 16:32 <a href="http://www.aygfsteel.com/tangzurui/archive/2008/07/29/218469.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>可变参数http://www.aygfsteel.com/tangzurui/archive/2008/07/25/217518.html梓枫梓枫Fri, 25 Jul 2008 08:57:00 GMThttp://www.aygfsteel.com/tangzurui/archive/2008/07/25/217518.htmlhttp://www.aygfsteel.com/tangzurui/comments/217518.htmlhttp://www.aygfsteel.com/tangzurui/archive/2008/07/25/217518.html#Feedback0http://www.aygfsteel.com/tangzurui/comments/commentRss/217518.htmlhttp://www.aygfsteel.com/tangzurui/services/trackbacks/217518.html W五章“可变参数?/span>

Ҏ(gu)重蝲是Java和其他面向对象语a最L(fng)色的Ҏ(gu)之一。当许多人可能认为Java的优势是它的cdQ或者是它所带的API库,其实让相同的Ҏ(gu)名与各种各样可接受的参数搭配也是一件很好的事?br />

Guitar guitar = new Guitar("Bourgeois", "Country Boy Deluxe",
GuitarWood.MAHOGANY, GuitarWood.ADIRONDACK,1.718);
Guitar guitar = new Guitar("Martin", "HD-28");
Guitar guitar = new Guitar("Collings", "CW-28"
GuitarWood.BRAZILIAN_ROSEWOOD, GuitarWood.ADIRONDACK,1.718,
GuitarInlay.NO_INLAY, GuitarInlay.NO_INLAY);

This code calls three versions of the constructor of a (fictional) Guitar class, meaning that information can be supplied when it’s available,rather than forcing a user to know everything about their guitar at one time (many professionals couldn’t tell you their guitar’s width at the nut).
Here are the constructors used:
public Guitar(String builder, String model) {
}
public Guitar(String builder, String model,
GuitarWood backSidesWood, GuitarWood topWood,
float nutWidth) {
}
public Guitar(String builder, String model,
GuitarWood backSidesWood, GuitarWood topWood,
float nutWidth,
GuitarInlay fretboardInlay, GuitarInlay topInlay) {
}


q段代码调用?jin)GuitarcM三个版本的构造器Q意味着当信息可见时Q这些信息会(x)被支持,而不是迫使每一个用者每一ơ都要去?jin)解关于Guitarcȝ所有知识。许多专家不?x)在关键时候告诉你他们的Guitar的内宏V下面是用到的构造器Q?br />
public Guitar(String builder, String model) {
}
public Guitar(String builder, String model,GuitarWood backSidesWood, GuitarWood topWood,float nutWidth) {
}
public Guitar(String builder, String model,GuitarWood backSidesWood, GuitarWood topWood,float nutWidth,
GuitarInlay fretboardInlay, GuitarInlay topInlay) {
}



然而,当你惌d加无限的信息Ӟ事情开始变得有一点不是那么有用了(jin)。例如:(x)假设你想允许在这个构造器中增加额外的未指明的Ҏ(gu)。下面就是一些可能的调用的例子:(x)

Guitar guitar = new Guitar("Collings", "CW-28"
GuitarWood.BRAZILIAN_ROSEWOOD, GuitarWood.ADIRONDACK,1.718,
GuitarInlay.NO_INLAY, GuitarInlay.NO_INLAY,"Enlarged Soundhole", "No Popsicle Brace");
Guitar guitar = new Guitar("Martin", "HD-28V","Hot-rodded by Dan Lashbrook", "Fossil Ivory Nut","Fossil Ivory Saddle", "Low-profile bridge pins");


对于q两个单独的情况Q你不得不去增加一个构造器来接受两个额外的字符Ԍ另外一个构造器来接受四个额外的字符丌Ӏ试囑ְq些怼的版本应用于早已重蝲的构造器。根据这L(fng)话,你最l会(x)得到20?0个那h蠢的构造器的版本!

原因在于我们常称做的可变参数。可变参数是Tiger的增加的另一个特性,它用一U相当y妙的Ҏ(gu)d地解决了(jin)q儿提出的问题。这一章讲qC(jin)q种相对单的Ҏ(gu)的各个斚w。这会(x)使你q速写出更好、更整洁、更灉|的代码?br />
创徏一个可变长度的参数列表

可变参数使得你可以指定某Ҏ(gu)来接受多个同一cd的参敎ͼ而且q不要求事先定参数的数量(在编译或q行Ӟ(j)?br />q就是Tiger的一个集成部分。事实上Q正是因为Java语言的一些新Ҏ(gu)组合在一h表现Z(jin)可变参数的特性?br />
我如何去实现呢?
首先Q你要习(fn)惯的书写省略P。。。)(j)。这三个点是可变参数的关键Q你会(x)l常键入它们。下面是Guitarcȝ构造器使用可变参数来接受不定数量字符串的一个例子:(x)

public Guitar(String builder, String model, String...features);


参数String... features 表明M数量的字W串都可能被接受?所以,下面所有的调用都合法的?br />
Guitar guitar = new Guitar("Martin", "HD-28V","Hot-rodded by Dan Lashbrook", "Fossil Ivory Nut","Fossil Ivory Saddle", "Low-profile bridge pins");
Guitar guitar = new Guitar("Bourgeois", "OMC","Incredible flamed maple bindings on this one.");
Guitar guitar = new Guitar("Collings", "OM-42","Once owned by Steve Kaufman--one of a kind");
You could add the same variable-length argument to the other constructors:
public Guitar(String builder, String model,
GuitarWood backSidesWood, GuitarWood topWood,float nutWidth, String... features)
public Guitar(String builder, String model,
GuitarWood backSidesWood, GuitarWood topWood,float nutWidth,
GuitarInlay fretboardInlay,GuitarInlay topInlay,String... features)


?-1描写?jin)一个把所有的q些Ҏ(gu)放在一L(fng)单类Q甚至用XX来一起传递一些可变参数?br />Example 5-1. Using varargs in constructors

package com.oreilly.tiger.ch05;
public class Guitar {
private String builder;
private String model;
private float nutWidth;
private GuitarWood backSidesWood;
private GuitarWood topWood;
private GuitarInlay fretboardInlay;
private GuitarInlay topInlay;
private static final float DEFAULT_NUT_WIDTH = 1.6875f;
public Guitar(String builder, String model, String... features) {
this(builder, model, null, null, DEFAULT_NUT_WIDTH, null, null, features);
}
public Guitar(String builder, String model,
GuitarWood backSidesWood, GuitarWood topWood,
float nutWidth, String... features) {
this(builder, model, backSidesWood, topWood, nutWidth, null, null, features);
}
public Guitar(String builder, String model,
GuitarWood backSidesWood, GuitarWood topWood,float nutWidth,
GuitarInlay fretboardInlay, GuitarInlay topInlay,String... features) {
this.builder = builder;
this.model = model;
this.backSidesWood = backSidesWood;
this.topWood = topWood;
this.nutWidth = nutWidth;
this.fretboardInlay = fretboardInlay;
this.topInlay = topInlay;
}
}


刚才发生?jin)什?
当你指定?jin)一个可变长度参数列?Java~译器实际上d “create an array of type <参数cd>”。你键入Q?br />
public Guitar(String builder, String model, String... features)


然而:(x)~译器解释这些ؓ(f)Q?br />
public Guitar(String builder, String model, String[] features)


q意味着重复参数列表变得单(q将在“重复可变长度参数列表”里讲述Q,q与你需要完成的其他E序设计目标是一栗?br />你可以像使用数组一h使用可变参数?br />然而,q同样存在一些限制。第一Q在每个Ҏ(gu)中,你只可以使用一ơ省略号。所以,下面的书写是不合法的Q?br />
public Guitar(String builder, String model,
String... features, float... stringHeights)


另外Q省略号必须作ؓ(f)Ҏ(gu)的最后一个参数?br />

如果你不需要传递Q何可变参数呢Q?/b>
那没关系Q你只需要以旧的方式调用构造器Q?br />
Guitar guitar = new Guitar("Martin", "D-18");


我们再仔l看看,虽然E序中没有与下面代码相匹配的构造器Q?br />
public Guitar(String builder, String model)


那么Q代码到底传递了(jin)什么呢Q作为可变参数的特例Q在参数中不传递东西是一个合法的选项。所以,当你看到 String... featuresQ你应该把它认ؓ(f)是零个或者更多个String参数。这省却你再d建另一个不带可变参数构造器的麻?ch)?br />
重复可变长度参数c表

所有这些可变参数是很好的。但是实际上Q如果你不在你的Ҏ(gu)中用它们的话,他们昄仅仅是吸引眼球的东西或是H户的装饰品而已?br />然而,你可以像你用数l一h使用可变参数Q你?x)觉得这U用法很单?br />
那我怎么来用可变参数呢Q?/b>
首先你要保阅读?jin)“创Z个可变长度的参数列表”,你会(x)从中?jin)解到可变参数方法最重要的东西,那就是我们把可变参数当作数组来看待?br />所以,l箋(hu)前面的例子,你可以写Z面的代码Q?br />
public Guitar(String builder, String model,
GuitarWood backSidesWood, GuitarWood topWood,float nutWidth,
GuitarInlay fretboardInlay, GuitarInlay topInlay,String... features) {
this.builder = builder;
this.model = model;
this.backSidesWood = backSidesWood;
this.topWood = topWood;
this.nutWidth = nutWidth;
this.fretboardInlay = fretboardInlay;
this.topInlay = topInlay;
for (String feature : features) {
System.out.println(feature);
}
}


上面的这D代码看上是不是不是那么的有吸引力?但这实体现?jin)可变参数的_N。作为另一个例子,下面q个单的Ҏ(gu)从一l数字中计算出最大|(x)
public static int max(int first, int... rest) {
int max = first;
for (int i : rest) {
if (i > max)
max = i;
}
return max;
}


是不是,够简单吧Q?br />

那么如何存储可变长度参数呢?
正因为Java~译器把q些看作数组Q所以数l显然是一个存储的好选择Q这在下面的例5-2中体现?br />Example 5-2. 存储作ؓ(f)成员变量的可变参?br />
package com.oreilly.tiger.ch05;
public class Guitar {
private String builder;
private String model;
private float nutWidth;
private GuitarWood backSidesWood;
private GuitarWood topWood;
private GuitarInlay fretboardInlay;
private GuitarInlay topInlay;
private String[] features;
private static final float DEFAULT_NUT_WIDTH = 1.6875f;
public Guitar(String builder, String model, String... features) {
this(builder, model, null, null, DEFAULT_NUT_WIDTH, null, null, features);
}
public Guitar(String builder, String model,
GuitarWood backSidesWood, GuitarWood topWood,
float nutWidth, String... features) {
this(builder, model, backSidesWood, topWood, nutWidth, null, null, features);
}
public Guitar(String builder, String model,
GuitarWood backSidesWood, GuitarWood topWood,
float nutWidth,
GuitarInlay fretboardInlay, GuitarInlay topInlay,
String... features) {
this.builder = builder;
this.model = model;
this.backSidesWood = backSidesWood;
this.topWood = topWood;
this.nutWidth = nutWidth;
this.fretboardInlay = fretboardInlay;
this.topInlay = topInlay;
this.features = features;
}
}


你可以简单地在Java的CollectioncM存储q些可变参数?br />
//变量声明
private List features;
//在方法中或是构造器中的书写
this.features = java.util.Arrays.asList(features);


允许雉度的参数列表
可变参数的一个显著的Ҏ(gu)是可变长度参数可以接受零到N个参数。这意味着你可以调用这些方法中的一个方法而不传递Q何参敎ͼE序同样可以q行。从另一斚w来说Q这又意味着Q作Z个程序员Q你最好意识到你必防范这U情늚发生?br />
如何实现它呢Q?/b>
记得在“重复可变长度参数类表”中Q你dq下面这个简单的Ҏ(gu)Q?br />
public static int max(int first, int... rest) {
int max = first;
for (int i : rest) {
if (i > max)
max = i;
}
return max;
}


你可以以多种形式来调用这个方法:(x)
int max = MathUtils.max(1, 4);
int max = MathUtils.max(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int max = MathUtils.max(18, 8, 4, 2, 1, 0);



有一点不是那么o(h)人满意的地方是,在很多情况下Q你要传递的数字已经存储在数l里Q或是至是在某些集成的形式中:(x)
//用这U方法来取得数字
int[] numbers = getListOfNumbers( );


要把q些数字传递给max()Ҏ(gu)是不可能的。你需要检查list的长度,从中截取掉第一个对象(如果存在W一个对象的话)(j)Q然后检查类型来保是int型。完成了(jin)q些Q你才可以带着数组中剩余的部分一起传递进入方法。而这数组中剩余的部分q要重复Q或者要人工地{化ؓ(f)适合的格式。MQ这个过E会(x)很辛苦,你需要做许多琐碎的事情。仔l想惻I你要记得~译器是这个方法解释ؓ(f)下面的语句:(x)
public static int max(int first, int[] rest)
所以,你可以做些调_(d)把max()Ҏ(gu)改写成下面这个样子:(x)
public static int max(int... values) {
int max = Integer.MIN_VALUE;
for (int i : values) {
if (i > max)
max = i;
}
return


你现在已l定义了(jin)一个可以很Ҏ(gu)接受数组的方法?br />
//用这U方法来取得数字
int[] numbers = getListOfNumbers( );
int max = MathUtils.max(numbers);


当接受单一的可变长度参数时Q你使用q种Ҏ(gu)?x)很单。但是,如果在最好的情况下,你传递了(jin)一个零长度的数l进去,q就?x)带来问题,你?x)得到难以预料的结果。ؓ(f)?jin)解册个问题,你需要一个小的错误检查。例5-3是MathUtilscȝ完整代码列表Q在q里是一个功能更强的MathUtilcR?br />

?-3 处理零参数的Ҏ(gu)
package com.oreilly.tiger.ch05;
public class MathUtils {
public static int max(int... values) {
if (values.length == 0) {
throw new IllegalArgumentException("No values supplied.");
}


M时候,你都可能?x)要处理雉度的参数列表Q这时你需要执行这cȝ错误(g)查。通常Q一个功能强大的IllegalArgumentExceptioncL一个好的选择?br />
int max = Integer.MIN_VALUE;
for (int i : values) {
if (i > max)
max = i;
}
return max;
}
}



那么关于调用同样的方法来处理通常参数不是数组的方法,又会(x)如何?q当然是完全合法的。下面的代码都是合法调用max()Ҏ(gu)的手D:(x)
int max = MathUtils.max(myArray);
int max = MathUtils.max(new int[] { 2, 4, 6, 8 });
int max = MathUtils.max(2, 4, 6, 8);
int max = MathUtils.max(0);
int max = MathUtils.max( );


指定对象参数Q而非基本cd

在第四章中我们谈刎ͼTiger通过拆箱增加?jin)一pd的新特征。你可以在处理可变参数时Q在你的Ҏ(gu)接受的参C使用对象包装cR?br />
如何实现Q?/b>
你一定记得在Java中所有的cLl都是java.lang.Object的子cR这意味着M对象可以被{化成一个Object对象。更q一步说Q因为像int和shortq样的基本类型会(x)自动转化成他们对应的对象包装c(像Integer和ShortQ?MJavacd可以被{化成一个Object对象?br />所以,如果你需要你的可变参数方法可以接受最多种参数的类型,那么你可以将Objectcd作ؓ(f)参数的类型。更好的是,Z(jin)辑ֈ多重功能Q绝大多数情况下都会(x)使用Object对象。例如,写个用来打印Ҏ(gu)?br />
private String print(Object... values) {
StringBuilder sb = new StringBuilder( );
for (Object o : values) {
sb.append(o)
.append(" ");
}
return sb.toString( );
}


q儿最单的意思是打印出所有的东西。然而,q个Ҏ(gu)更通用的定义是下面的样子:(x)
private String print(String... values) {
StringBuilder sb = new StringBuilder( );
for (Object o : values) {
sb.append(o)
.append(" ");
}
return sb.toString( );
}


q个Ҏ(gu)的问题是Ҏ(gu)自n不能接受字符?整数,点?数组和其他的cd数据Q而这些数据你都想要正常的打印出来。通过使用Objectq个更ؓ(f)通用的类型,你可以来打印所有的一切?br />
private String print(Object... values) {
StringBuilder sb = new StringBuilder( );
for (Object o : values) {
sb.append(o)
.append(" ");
}
return sb.toString( );
}


避免数组自动转化

Tiger增加?jin)各U类型的自动转化和便利,q些东西在绝大多数的情况下是很好用的。不q的是,有些时候所有的q些东西?x)变成你的障。其中一U情冉|Q在可变参数Ҏ(gu)中将多个Object对象转化为Object[]数组对象Q你?x)发现在个别的情况下Q你需要用Java来书写?br />

如何实现Q?/b>
在将要仔l讨件事情前Q你要确信自q解这个问题。Java新的printf()Ҏ(gu)是一个很好的便利QDq个Ҏ(gu)作个例子Q?br />
System.out.printf("The balance of %s's account is $%(,6.2f\n",account.getOwner().getFullName( ),account.getBalance( ));




如果你看一下Java文档中关于printf()Ҏ(gu)的说明,你就?x)看到它是一个可变参数的Ҏ(gu)。它有两个参敎ͼ(x)一个是用于讄字符串格式的Stringcd变量Q另一个是所有要传递进字符串的Object对象:
PrintStream printf(String format, Object... args)


现在Q你可以把上面的代码默认Z面的形式Q?br />
PrintStream printf(String format, Object[] args)


两种书写是不是完全相同呢Q大多数情况下是相同的。考虑一下下面的代码Q?br />
Object[] objectArray = getObjectArrayFromSomewhereElse( );
out.printf("Description of object array: %s\n", obj);


q是乎有点牵强,然而要把它看作是ؓ(f)?jin)自省的代码而付出的正常开销。比起其它代码,q样写要z的多。如果你正在~写一个代码分析工P或者一个集成开发环境,或者其他可能用reflection或简单API来判断出应用E序?x)需要何U对象的东西Q这些马上会(x)成ؓ(f)一个通用的案例。这儿,你不是真正关?j)对象数l的内容Q就像你同样不会(x)d?j)数l自w一栗它是什么类型?它的内存地址是多?它的字符串代表什么意思?L(fng)记所有这些问题都是和数组本n有关的,和数l的内容无关。例如:(x)我们来看看下面的数组代码Q?br />
public Object[] getObjectArrayFromSomewhereElse( ) {
return new String[] {"Hello", "to", "all", "of", "you"};
}



在这U情况下Q你肯能?x)写一些像下面一L(fng)代码来回{某些关于数l的问题Q?br />
out.printf("Description of object array: %s\n", obj);


然而,输出l果q不是你所期望的那P(x)
run-ch05:
[echo] Running Chapter 5 examples from Java Tiger: A Developer's Notebook
[echo] Running VarargsTester...
[java] Hello


q倒是怎么回事Q这׃是你想看到的l果。然而,~译器做?jin)它应该做的Q它把在printf()Ҏ(gu)里的Object...转换为Object[]。实际上Q当~译器得CҎ(gu)的调用时Q它看到的参数是Object[]。所以编译器不是把这个数l看作一个Object对象本nQ而是把它分成不同的部分。这栯传递给字符串格?(%s)的就是第一个参数部分“Hello”字W串Q所以结果“Hello”就昄出来?jin)?br />
仔细看看qg事,你需要去告诉~译器你要把整个对象数组obj看作是一个简单的对象Q而不是一l参数。请看下面奇特的代码Q?br />
out.printf("Description of object array: %s\n", new Object[] { obj });


作ؓ(f)选择Q还有一U更为简单的Ҏ(gu)Q?br />
out.printf("Description of object array: %s\n", (Object)obj);



在上面两U书写情况下Q编译器不再认ؓ(f)是对象的数组Q而是直接认ؓ(f)是一个简单的Object对象Q而这个Object对象又恰好是一个对象数l。那么结果就如你所愿(臛_在这U简单的应用下)(j)Q?br />
run-ch05:
[echo] Running Chapter 5 examples from Java Tiger: A Developer's Notebook
[echo] Running VarargsTester...
[java] [Ljava.lang.String;@c44b88


看到l果Q你肯能?x)感到有炚w乱。这大概是基于reflection或者其他自省代码需要的l果?br />
全章?


梓枫 2008-07-25 16:57 发表评论
]]>
J2SE5中的最新注释功能SuppressWarnings http://www.aygfsteel.com/tangzurui/archive/2008/07/22/216555.html梓枫梓枫Tue, 22 Jul 2008 03:36:00 GMThttp://www.aygfsteel.com/tangzurui/archive/2008/07/22/216555.htmlhttp://www.aygfsteel.com/tangzurui/comments/216555.htmlhttp://www.aygfsteel.com/tangzurui/archive/2008/07/22/216555.html#Feedback0http://www.aygfsteel.com/tangzurui/comments/commentRss/216555.htmlhttp://www.aygfsteel.com/tangzurui/services/trackbacks/216555.html阅读全文

梓枫 2008-07-22 11:36 发表评论
]]>
体验Java 5.0的新增语aҎ(gu)?/title><link>http://www.aygfsteel.com/tangzurui/archive/2008/07/21/216477.html</link><dc:creator>梓枫</dc:creator><author>梓枫</author><pubDate>Mon, 21 Jul 2008 15:01:00 GMT</pubDate><guid>http://www.aygfsteel.com/tangzurui/archive/2008/07/21/216477.html</guid><wfw:comment>http://www.aygfsteel.com/tangzurui/comments/216477.html</wfw:comment><comments>http://www.aygfsteel.com/tangzurui/archive/2008/07/21/216477.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/tangzurui/comments/commentRss/216477.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/tangzurui/services/trackbacks/216477.html</trackback:ping><description><![CDATA[     摘要: 增强的for循环 <br>   Z(jin)q代集合和数l,增强的for循环提供?jin)一个简单、兼容的语法。有两点值得一提:(x)   Init表达?<br> <br>  在@环中Q初始化表达式只计算一ơ。这意味着(zhn)通常可以U除一个变量声明。在q个例子中,我们必须创徏一个整型数l来保存computeNumbers()的结果,以防止每一ơ@环都重新计算该方法。?zhn)可以看到Q下面的代码要比上面的代码整z一些,q且没有泄露变量numbersQ? <br> <br>  未增强的ForQ  int sum = 0;  Integer[] numbers = computeNumbers();  for (int i=0; i < numbers.length ; i++) sum += numbers[i];   增强后的ForQ?   int sum = 0;  for ( int number: computeNumbers() ) sum += number;...... <br>  <a href='http://www.aygfsteel.com/tangzurui/archive/2008/07/21/216477.html'>阅读全文</a><img src ="http://www.aygfsteel.com/tangzurui/aggbug/216477.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/tangzurui/" target="_blank">梓枫</a> 2008-07-21 23:01 <a href="http://www.aygfsteel.com/tangzurui/archive/2008/07/21/216477.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ų</a>| <a href="http://" target="_blank">ʩ</a>| <a href="http://" target="_blank">̫</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">е</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">IJ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ǰ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">пǰ</a>| <a href="http://" target="_blank">ӱ</a>| <a href="http://" target="_blank">˹</a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Դ</a>| <a href="http://" target="_blank">崨</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͩ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>