??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品9999久久久久无码,中文字幕亚洲第一,国产亚洲精品拍拍拍拍拍 http://www.tkk7.com/haosola/archive/2014/11/16/420127.html好不Ҏ 好不Ҏ Sun, 16 Nov 2014 00:47:00 GMT http://www.tkk7.com/haosola/archive/2014/11/16/420127.html http://www.tkk7.com/haosola/comments/420127.html http://www.tkk7.com/haosola/archive/2014/11/16/420127.html#Feedback 1 http://www.tkk7.com/haosola/comments/commentRss/420127.html http://www.tkk7.com/haosola/services/trackbacks/420127.html JAVA中在q用数组q行排序功能Ӟ一般有四种ҎQ快速排序法、冒泡法、选择排序法、插入排序法?br /> 快速排序法主要是运用了Arrays中的一个方法Arrays.sortQ)实现SAT{案 冒法是q用遍历数组q行比较Q通过不断的比较将最值或者最大g个一个的遍历出来?br /> 选择排序法是数l的W一个数据作为最大或者最的|然后通过比较循环Q输出有序的数组?br /> 插入排序是选择一个数l中的数据,通过不断的插入比较最后进行排序。下面我将他们的实现方法一一详解供大家参考?br /> <1>利用Arrays带有的排序方法快速排?br /> 1 import java.util.Arrays; 2 public class Test2{ 3 public static void mainQString[] argsQ{ 4 int[] a={5,4,2,4,9,1}; 5 Arrays.sortQaQ; //q行排序 6 forQint i: aQ{ 7 System.out.printQiQ; 8 } 9 } 10 } <2>冒排序法 1 public static int[] bubbleSortQint[] argsQ{//冒排序法 2 forQint i=0;i<args.length-1;i++Q{ 3 forQint j=i+1;j<args.length;j++Q{ 4 if Qargs[i]>args[j]Q{ 5 int temp=args[i]; 6 args[i]=args[j]; 7 args[j]=temp; 8 } 9 } 10 } 11 return args; 12 } <3>选择排序法 1 public static int[] selectSortQint[] argsQ{//选择排序法 2 for Qint i=0;i<args.length-1 ;i++ Q{ 3 int min=i; 4 for Qint j=i+1;j<args.length ;j++ Q{ 5 if Qargs[min]>args[j]Q{ 6 min=j; 7 } 8 } 9 if Qmin!=iQ{ 10 int temp=args[i]; 11 args[i]=args[min]; 12 args[min]=temp; 13 } 14 } 15 return args; 16 } <4>插入排序法 1 public static int[] insertSortQint[] argsQ{//插入排序法 2 forQint i=1;i<args.length;i++Q{ 3 forQint j=i;j>0;j--Q{ 4 if Qargs[j]<args[j-1]Q{ 5 int temp=args[j-1]; 6 args[j-1]=args[j]; 7 args[j]=temp; 8 }else break; 9 } 10 } 11 return args; 12 } 以上是java中的四种排序Ҏ。不同的Ҏ效率不一P下面是不同的法的比较和数据交换时的大O表示?br /> 冒排序Q比较OQN2Q?数据交换OQN2Q?br /> 选择排序Q比较OQN2Q?数据交换OQNQ?br /> 插入排序Q比较OQN2Q?复制数据OQNQ?br /> 在实际应用中Q我们要量选择效率高的法托福{案 托福{案
]]>java的抽象类和抽象方?/title> http://www.tkk7.com/haosola/archive/2014/11/16/420126.html好不Ҏ 好不Ҏ Sun, 16 Nov 2014 00:39:00 GMT http://www.tkk7.com/haosola/archive/2014/11/16/420126.html http://www.tkk7.com/haosola/comments/420126.html http://www.tkk7.com/haosola/archive/2014/11/16/420126.html#Feedback 1 http://www.tkk7.com/haosola/comments/commentRss/420126.html http://www.tkk7.com/haosola/services/trackbacks/420126.html 抽象cd是不能用newҎq行实例化的c,x有具体实例对象的cR抽象类有点cM“模板”的作用,目的是根据其格式来创建和修改新的cR对象不能由抽象cȝ接创建,只可以通过抽象cL生出新的子类Q再由其子类来创建对象。当一个类被声明ؓ抽象cLQ要在这个类前面加上修饰Wabstract. 在抽象类中的成员Ҏ可以包括一般方法和抽象Ҏ。抽象方法就是以abstract修饰的方法,q种Ҏ只声明返回的数据cd、方法名U和所需的参敎ͼ没有Ҏ体,也就是说抽象Ҏ只需要声明而不需要实现。当一个方法ؓ抽象ҎӞ意味着q个Ҏ必须被子cȝҎ所重写Q否则其子类的该Ҏ仍然是abstract的,而这个子cM必须是抽象的Q即声明为abstract. 抽象cM不一定包含抽象方法,但是包含抽象Ҏ的类一定要被声明ؓ抽象cR抽象类本n不具备实际的功能Q只能用于派生其子类。抽象类中可以包含构造方法,但是构造方法不能被声明为抽象?br /> 调用抽象cM的方法(抽象Ҏ和非抽象ҎQ,如果Ҏ是static的,直接 抽象cR方?可以了Q如果是非static的则必须需要一个承的非抽象类Q然后用q个非抽象类的实例来调用Ҏ?br /> 抽象cd以实现接口,接口中的Ҏ 在抽象类中可以不实现Q当有子cȝ?抽象cLQƈ且子cM是抽象类Ӟ子类需要将抽象cM?抽象Ҏ和接口中的方法都实现托福{案 抽象cM能用final来修饎ͼ即一个类不能既是最l类又是抽象c?strong>托福{案 ȝQ?abstract不能与private、static、final、nativeq列修饰同一个方法?/div> ]]> Java实现的网l文件传?/title> http://www.tkk7.com/haosola/archive/2014/09/20/418119.html好不Ҏ 好不Ҏ Sat, 20 Sep 2014 07:01:00 GMT http://www.tkk7.com/haosola/archive/2014/09/20/418119.html http://www.tkk7.com/haosola/comments/418119.html http://www.tkk7.com/haosola/archive/2014/09/20/418119.html#Feedback 0 http://www.tkk7.com/haosola/comments/commentRss/418119.html http://www.tkk7.com/haosola/services/trackbacks/418119.html FileUpload包下放了三个c: OpenAndSave.java TCPClient .java TCPServer.java 1、OpenAndSave.java package FileUpload; import java.awt.*; import javax.swing.*; import java.util.*; import java.io.*; public class OpenAndSave extends JFrame { // 选择打开文g public String getFileQ) { String fileName=""; FileDialog fd = new FileDialogQthis, "请选择要传lzpc的文?, FileDialog.LOADQ; fd.setDirectoryQ?C:\\"Q; fd.setVisibleQtrueQ; // 获取此文件对话框选定的文?br /> if Qfd.getFileQ)Q? nullQ?{ fileName=fd.getDirectoryQ) + fd.getFileQ)Q?br /> System.out.printlnQ?已选择打开 " +fileName Q; } return fileName; } // 保存文g public OutputStream saveFileQString fileNameQ?{ OutputStream os=null; try { FileDialog fd = new FileDialogQthis, "保存文g", FileDialog.SAVEQ; // 对话框打开时显C默认的目录 fd.setDirectoryQ?C:\\"Q; fd.setFileQfileNameQ; fd.setVisibleQtrueQ; if Qfd.getFileQ) != nullQ?{ File myFile = new FileQfd.getDirectoryQ)Q?fd.getFileQ)Q; os = new FileOutputStreamQmyFileQ; } } catch QIOException ioeQ?{ JOptionPane.showMessageDialogQthis, "文g保存发生错误Q已停止"Q; } return os; } } 2、TCPServer.java /* * Author:zpc * Time:2014-5-1 */ package FileUpload; import java.io.*; import java.net.*; import java.util.Random; import javax.swing.*; //每接受一个客Lh单开一个线E处?br /> class UploadProcess implements Runnable { private Socket s; public UploadProcessQSocket sQ?{ this.s = s; } public void runQ) { OutputStream fos = null; try { DataInputStream fis = new DataInputStreamQs.getInputStreamQ)Q;// 和复制文件不同的是网l上传文件是从Socket中获取的I/O对?br /> String fileName = fis.readUTFQ)Q?br /> DataOutputStream fos1= new DataOutputStreamQs.getOutputStreamQ)Q;//写回信息Q?br /> if Q(JOptionPane.showOptionDialogQnull, "您想接受文g" + fileName + "吗?", "消息", JOptionPane.YES_NO_OPTION, 0, null, null, nullQ) == 0Q?{ System.out.printlnQ?我已选择接受文gQ?Q; String message1="服务器已接收Q?; fos1.writeUTFQmessage1Q; fos = new OpenAndSaveQ)。saveFileQfileNameQ; int len = 0; byte[] bytes = new byte[1024]; if Qfis != nullQ?{ while Q(len = fis.readQbytesQ) != -1Q?{ fos.writeQbytes, 0, lenQ; } } JOptionPane.showMessageDialogQnull, "文g保存成功Q?Q; if Qfis != nullQ?br /> fis.closeQ)Q?br /> if Qfos != nullQ?br /> fos.closeQ)Q?br /> } else { System.out.printlnQ?我选择了拒l接受!"Q; String message2="提示Q对方已拒绝接受Q?; fos1.writeUTFQmessage2Q; } } catch QException eQ?{ System.out.printlnQ?接受文gp|Q?Q; } } } public class TCPServer { public static void mainQString[] argsQ?throws IOException { // 建立服务器端的socket对象ServerSocket ServerSocket ss = new ServerSocketQ?0001Q; while QtrueQ?{ Socket s = ss.acceptQ)Q?br /> // 每个客户端的h创徏一个Socket对象Q单开一个线E处?br /> new ThreadQnew UploadProcessQsQ)。startQ)Q?br /> } } } 3、TCPClient .java /* * Author:zpc * Function:上传文gl用户zpc * Time:2014-5-1 */ package FileUpload; import java.io.*; import java.net.*; public class TCPClient { public static void mainQString[] argsQ?throws UnknownHostException{ // q行文g的读取。数据源SAT{案 OpenAndSave open = new OpenAndSaveQ)Q?br /> String fileName = open.getFileQ)Q?br /> File myFile = new FileQfileNameQ; InputStream in = null; try { in = new FileInputStreamQmyFileQ; } catch QFileNotFoundException e1Q?{ System.out.printlnQ?未选中文gQ?Q; } // 数据目的地是另一C机,通过Socket获取I/O?br /> if Qin != nullQ?{ Socket s = null; try { s = new SocketQ?127.0.0.1", 10001Q;//q里写好目标机器IP地址和Q意一个开攄未被其它E序占用的端口号 DataOutputStream os = new DataOutputStreamQs.getOutputStreamQ)Q;托福{案 os.writeUTFQfileNameQ; byte[] b = new byte[1024]; int len = 0; while Q(len = in.readQbQ) != -1Q?{ os.writeQb, 0, lenQ; } //System.out.printlnQ?message"Q; DataInputStream fis = new DataInputStreamQs.getInputStreamQ)Q; String message = fis.readUTFQ)Q?br /> System.out.printlnQmessageQ; if Qos != nullQ?br /> os.closeQ)Q?br /> if Qin != nullQ?br /> in.closeQ)Q?br /> } catch QException eQ?{ System.out.printlnQ?貌似zpc不在U,E后再传Q!"Q; } } else { System.out.printlnQ?文gdp|Qin = nullQ!"Q; } } ]]> JAVA中运用数l的四种排序Ҏ http://www.tkk7.com/haosola/archive/2014/09/20/418118.html好不Ҏ 好不Ҏ Sat, 20 Sep 2014 06:57:00 GMT http://www.tkk7.com/haosola/archive/2014/09/20/418118.html http://www.tkk7.com/haosola/comments/418118.html http://www.tkk7.com/haosola/archive/2014/09/20/418118.html#Feedback 0 http://www.tkk7.com/haosola/comments/commentRss/418118.html http://www.tkk7.com/haosola/services/trackbacks/418118.html JAVA中在q用数组q行排序功能Ӟ一般有四种ҎQ快速排序法、冒泡法、选择排序法、插入排序法?br /> 快速排序法主要是运用了Arrays中的一个方法Arrays.sortQ)实现?strong>托福{案 冒法是q用遍历数组q行比较Q通过不断的比较将最值或者最大g个一个的遍历出来?br /> 选择排序法是数l的W一个数据作为最大或者最的|然后通过比较循环Q输出有序的数组?br /> 插入排序是选择一个数l中的数据,通过不断的插入比较最后进行排序。下面我将他们的实现方法一一详解供大家参考?br /> <1>利用Arrays带有的排序方法快速排?strong>SAT{案 1 import java.util.Arrays; 2 public class Test2{ 3 public static void mainQString[] argsQ{ 4 int[] a={5,4,2,4,9,1}; 5 Arrays.sortQaQ; //q行排序 6 forQint i: aQ{ 7 System.out.printQiQ; 8 } 9 } 10 } <2>冒排序法 1 public static int[] bubbleSortQint[] argsQ{//冒排序法 2 forQint i=0;i<args.length-1;i++Q{ 3 forQint j=i+1;j<args.length;j++Q{ 4 if Qargs[i]>args[j]Q{ 5 int temp=args[i]; 6 args[i]=args[j]; 7 args[j]=temp; 8 } 9 } 10 } 11 return args; 12 } <3>选择排序法 1 public static int[] selectSortQint[] argsQ{//选择排序法 2 for Qint i=0;i<args.length-1 ;i++ Q{ 3 int min=i; 4 for Qint j=i+1;j<args.length ;j++ Q{ 5 if Qargs[min]>args[j]Q{ 6 min=j; 7 } 8 } 9 if Qmin!=iQ{ 10 int temp=args[i]; 11 args[i]=args[min]; 12 args[min]=temp; 13 } 14 } 15 return args; 16 } <4>插入排序法 1 public static int[] insertSortQint[] argsQ{//插入排序法 2 forQint i=1;i<args.length;i++Q{ 3 forQint j=i;j>0;j--Q{ 4 if Qargs[j]<args[j-1]Q{ 5 int temp=args[j-1]; 6 args[j-1]=args[j]; 7 args[j]=temp; 8 }else break; 9 } 10 } 11 return args; 12 } 以上是java中的四种排序Ҏ。不同的Ҏ效率不一P下面是不同的法的比较和数据交换时的大O表示?br /> 冒排序Q比较OQN2Q?数据交换OQN2Q?br /> 选择排序Q比较OQN2Q?数据交换OQNQ?br /> 插入排序Q比较OQN2Q?复制数据OQNQ?br /> 在实际应用中Q我们要量选择效率高的法?/p> ]]> 用Guava辅助Throwable异常处理 http://www.tkk7.com/haosola/archive/2014/09/20/418117.html好不Ҏ 好不Ҏ Sat, 20 Sep 2014 06:52:00 GMT http://www.tkk7.com/haosola/archive/2014/09/20/418117.html http://www.tkk7.com/haosola/comments/418117.html http://www.tkk7.com/haosola/archive/2014/09/20/418117.html#Feedback 0 http://www.tkk7.com/haosola/comments/commentRss/418117.html http://www.tkk7.com/haosola/services/trackbacks/418117.html Guava?Throwables 工具常常可以让exception处理更方ѝ?br /> Propagation 有时候,你会x捕获的exception抛到上一个try/catch块。对?RuntimeException ?Error ؓ如此Q它们不需?try/catch 块,但可能被其他?try/catch 块无意捕莗?br /> Guava 提供了一些工h化propagate exception。例如: try{ someMethodThatCouldThrowAnything(); }catch(IKnowWhatToDoWithThisException e){ handle(e); }catch(Throwable t){ Throwables.propagateIfInstanceOf(t, IOException.class); Throwables.propagateIfInstanceOf(t, SQLException.class); throw Throwables.propagate(t); } q里的每个方法都会抛出它们自qexceptionQ但是throw最l结?—— 如,throw Throwables.propagate(t) —— 对编译检查有指示作用Q提C里肯定会抛出一个exception?br /> q里是Guava提供的propagationҎ的简单ȝQ?br /> 参数形式解释 RuntimeException propagate(Throwable)如果参数throwable?RuntimeException ?Error 则原样propagateQ否则将它包?RuntimeException 中抛出。保证抛出。返回值是 RuntimeException cdQ因此你可以像上面那样写 throw Throwables.propagate(t) Q这样Java~译器会明白q一行肯定会抛出一个exception?br /> void propagateIfInstanceOf(Throwable, Class) throws X仅当参数throwable?X cdӞ原样propagate?br /> void propagateIfPossible(Throwable)仅当参数throwable?RuntimeException ?Error cdӞ原样propagate?br /> void propagateIfPossible(Throwable, Class) throws X仅当参数 throwable ?RuntimeException ?Error ?X cdӞ原样propagate?br /> Throwables.propagate的用?模仿Java 7的多重catch和重新throw 一般来_调用者如果想要让exception沿着调用栈传播,他只要不?catch 块就可以了。既然他不打在exception后恢复,他恐怕也不需要写入log或者采取什么其他行动。他可能需要进行一些清理工作,但是无论有没有expction都会需要,因此清理工作会放?finally 块中。尽如此,会重新throw?catch 块有时还是有意义的:也许调用者想要在传播exception之前先更新崩溃计数器Q或者他只想在特定条件下传播exception?br /> 只有一Uexception的时候,catch和重新throw是简单直接的。麻烦的是有多种exception的时候: @Overridepublicvoid run(){ try{ delegate.run(); }catch(RuntimeException e){ failures.increment(); throw e; }catch(Error e){ failures.increment(); throw e; } } Java 7?multicatch 来解册个问? }catch(RuntimeException|Error e){ failures.increment(); throw e; } 但不用Java 7的用户就没办法了。他们也惛_如下的代码,但编译器不允许抛出Throwablecd的变? }catch(Throwable t){ failures.increment(); throw t; } 解决Ҏ是用 throw Throwables.propagate(t) 来替?throw t 。仅pU情况而言Q?Throwables.propagate 跟之前代码的功能完全相同。但是,代码里写 Throwables.propagate 很容易有一U隐藏的副作用。具体来_要注意上面这U模式只适用?RuntimeException ?Error。如?catch 块可能捕捉checked exceptionQ你q需要调?propagateIfInstanceOf 来保证正常功能,因ؓ Throwables.propagate 无法直接传播checked exception?br /> M来说Q这U?propagate 的用法效果一般。在Java 7下没必要q样做。在其他版本的Java下,q样能略微减重复,但是一个简单的Extract Method重构也可以达到同h果。另外,使用 propagate makes it easy to accidentally wrap checked exceptions. 无用功:?throws Throwable 转化?throws Exception 某些APIQ尤其是Java reflection API ?(相应? JUnitQ有抛出 Throwable 的方法。运用这些API可能很麻烦,因ؓq是最通用的API一般也只声明throws Exception?Throwables.propagate 是ؓ?Exception Q非 Error ?Throwable 准备的。这个例子声明了一个执行JUnit试?Callable : public void call() throws Exception{ try{ FooTest.super.runTest(); }catch(Throwable t){ Throwables.propagateIfPossible(t,Exception.class); Throwables.propagate(t); } return null; } q里没必要propagate()Qƈ且第二行?"throw new RuntimeException(t)"{h?(Z说一句:q个例子也提醒了?propagateIfPossible 可能令hqhQ因为它不仅传播参数指定的类型,也传?Error ?RuntimeException? q种模式 (或者类似的写法Q如"throw new RuntimeException(t)") 在Google的代码库里至出?30 ơ?搜烦'propagateIfPossible[^;]* Exception.class[)];'试试? 采用"throw new RuntimeException(t)"写法的略占多数。我们也有可能想要一?throwWrappingWeirdThrowable"Ҏ来做Throwable到Exception的{换,但是既然两行p搞定Q这个方法还是没有太大必要,除非我们要废除propagateIfPossibleҎ?strong>sat{案 Throwables.propagate有争议的用法 有争议:?checked exception 转化?unchecked exception 理论上,unchecked exception表示有bugQchecked exceptions表示在你控制范围之外的问题。但在实践上Q即使JDK有时也会用错 (臛_Q对于某些方法,没有普遍认同的正答??br /> 因此Q有时调用者需要让q两Uexceptioncd怺转化Q?br /> try{ return Integer.parseInt(userInput); }catch(NumberFormatException e){ throw new InvalidInputException(e); } try{ return publicInterfaceMethod.invoke(); }catch(IllegalAccessException e){ throw new AssertionError(e); } 有时候,q些调用者会?Throwables.propagate 。有什么坏处呢?最主要的问题是代码的含义不太明显。throw Throwables.propagate(ioException) 有什么效?throw new RuntimeException(ioException) 有什么效?q两行代码功能是相同的,但后者更直白。前者人生疑:"q是在做什?应该不只是打包成 RuntimeException ?如果只ؓq个Qؓ何不写一个wrapperҎ?"只能承认Q部分问题在?propagate"q个名字很含p?它是一个抛出未声明exception的方式吗?) 也许换成"wrapIfChecked"会好一些。但即叫这个名字,在已知checked exception上调用它也没有什么优ѝ可能还会有副作? 也许会有比普?RuntimeException 更合适的抛出cd -- 比如Q?IllegalArgumentException?br /> 我们有时也会看到在exception仅仅有可能是checked exception时用 propagate 。相Ҏ_q种做法后果一些,也不那么直白Q?br /> }catch(RuntimeException e){ throw e; }catch(Exception e){ throw new RuntimeException(e); } }catch(Exception e){ throw Throwables.propagate(e); } 管如此Q这里不可忽视的问题在于checked exception转化为unchecked exception的行为本w。在某些情况下是无可厚非的,但更多的时候这样做是在逃避对常?checked exception 的处理。这让我们思考checked exception本n是否是一个坏L。我不想说得q么深入。姑且说 QThrowables.propagate 不是?Java 使用者用来忽?IOException 及类似异常的?br /> 有争? Exception隧道托福{案 但是当你实现一个不允许throw exception的方法时怎么办呢?有时你需要把exception打包在unchecked exception中。这h问题Q但同样的,对于单纯的打?propagate 没有必要。事实上Q自己实现打包会更好一些:如果你把每个exception(而不只是checked exception)打包Q那可以在另一端解包,减少Ҏ处理。另外,最好打包成自定义的exceptioncd?br /> 有争? 重新抛出其他U程的exception try{ return future.get(); }catch(ExecutionException e){ throw Throwables.propagate(e.getCause()); } q里有几件要考虑的事Q?br /> 对于checked exceptionQ参见上面的"?checked exception 转化?unchecked exception"一节。但如果此处已知不会抛出checked exception? (也许?Runnable 的结果? 如上所qͼ你可以catchq个exception然后抛出 AssertionError ;propagate 没有什么用。特别的是,对于FutureQ也可以考虑Futures.get?br /> 对于非ExceptionQ非Error的Throwable?好吧Q这个可能性不大,但是如果你试囄接重新throw它,~译器会你考虑q种可能) 参考上面的 "?throws Throwable 转化?throws Exception" 一? 对于unchecked exception或error。那么它会直接被重新throw。不q的是,它的stack trace会显C原先生exception的线E,而不是当前传播到的线E。一般最好的l果是把两个U程的stack trace都包括在exception chain中,像 get 抛出?ExecutionException 一栗?q其实不?propagate 的问? q是所有把 exception 在另一个线E抛出的共同问题? 因果?br /> Guava让研I一个exception的因果链(causal chain)更简单了一些,它提供了以下3个很有用的方法,功能思义: Throwable getRootCause(Throwable) List getCausalChain(Throwable) String getStackTraceAsString(Throwable) ]]> Java下static关键字用法详?/title> http://www.tkk7.com/haosola/archive/2014/09/10/417811.html好不Ҏ 好不Ҏ Wed, 10 Sep 2014 14:29:00 GMT http://www.tkk7.com/haosola/archive/2014/09/10/417811.html http://www.tkk7.com/haosola/comments/417811.html http://www.tkk7.com/haosola/archive/2014/09/10/417811.html#Feedback 0 http://www.tkk7.com/haosola/comments/commentRss/417811.html http://www.tkk7.com/haosola/services/trackbacks/417811.html 本文章介l了java下static关键字的用法Q大部分内容摘自原作者,在此学习q分享给大家?br /> Static关键字可以修C? 从以下测试可以看出, static 可以修饰: 1. 语句?br /> 2. 成员变量(但是不能修饰局部变? 3. Ҏ 4. 接口(内部接口) 5. c?只能修饰在类中的c, 即静态内部类) 6. jdk 1.5 中新增的静态导?br /> 那么static 修饰的表CZ么呢? 当创Z个类Ӟ是在创Z个新cdQ描q这个类的对象的外观和行为,除非用new创徏出那个类的对象,数据存储I间才被分配Q其Ҏ才供外界调用。那么当声明一个事物ؓstaticӞ意味着q个域或者方法不会与包含它的那个cȝM对象兌在一P也就是说Q它不依赖类特定的实例,被类的所有实例共享,只要q个c被加蝲QJava虚拟机就能根据类名在q行时数据区的方法区内定扑ֈ他们。因此,static对象可以在它的Q何对象创Z前访问,无需引用M对象?br /> 1. static 修饰语句? static{} 可以有多处,执行序按照他们的声明顺序。当JVM加蝲q个cȝ时候,׃执行此语句块Qƈ且只执行一ơ?br /> 2. static 变量: static 变量Q可以被cȝ所有对象共享,q且它只有一份存储空_JVM只ؓ静态分配一ơ内存,在加载类的过E中完成静态变量的内存分配。那么在引用static变量的时候,使用(cd.变量?是首选的方式Q因Z不仅它是staticl构Q而且在某些情况下会ؓ~译器进行优化提供更好的Z?br /> 使用cd直接引用static变量是比较力荐的Q这样就很明的告诉大家该变量或属性是staticl构或是被static修饰?br /> 但是我想说一个更重要的知识点。static 在类中当变量的重要用方法,首先g先运行一下下面代码试试: public class Person { static int[] arr = new int[3]; public static void main(String[] args){ Person per1 = new Person(); Person per2 = new Person(); Person per3 = new Person(); System.out.println("----改变之前-----"); System.out.print("per1-->"); per1.show(); System.out.print("per2-->"); per2.show(); System.out.print("per3-->"); per3.show(); //现在我改变它的?br /> Person.arr[2]=10;//q种Ҏ是徏议的 per1.arr[0]=1;//一般不用这U方?br /> System.out.println("----改变之后-----"); System.out.print("per1-->"); per1.show(); System.out.print("per2-->"); per2.show(); System.out.print("per3-->"); per3.show(); } //Z方便Q封装一个方法,来解?br /> public void show(){ for(int i=0; i System.out.print(arr[i] + "t"); } System.out.println(""); } }OutputQ?br /> ----改变之前----- per1-->0t0t0t per2-->0t0t0t per3-->0t0t0t ----改变之后----- per1-->1t0t10t per2-->1t0t10t per3-->1t0t10t cM的Ş式同样应用在使用static修饰的方法上?UCؓ静态方?。它可以像普通方法一样用对象来引用Q也可以通过Ҏ的语法Ş式来调用如:“cd”+“ . ”+“Ҏ”(); 定义静态方法的方式与定义静态变量一P public class StaticTest2 { static void method(){ ("q是静态方?); } } 普通的调用ҎQStaticTest2 st = new StaticTest2(); 因ؓmethod是static修饰?静态方?Q所以可以这栯用:StaticTest2.()?br /> 3. staticҎ: staticҎ与非staticҎ的区别在? staticҎ可以用类名直接访问在static内部的变量和ҎQ而不能引用非static的变量或者方法,但是你可以通过传递参数的方式传递一个引用,让这个引用去调用非静态数据?br /> 4. static 接口: 内部接口(inner interface)本n默认是staticQ所以static关键词加与不加都是一LQ?如此例中的接?TestInInterfaceQTestInClass 实现此接口, 以下语句Q?br /> StaticDescription.TestInInterface a = new StaticDescription.TestInClass(); a.print(); 我们Lstatic关键字也是一LQ?但还是受讉K权限控制TestInterface和FF?br /> 5. static 修饰c?(后部分会详细说明) 表示它是一个静态内部类Q它在引用外部类的事物时Q必M是static的。而且Q?静态内部类在创q对象Ӟ 是不需要外围类的存在。就好像下面的部分: class Member { static int classVar = 0; //cd?br /> int instanceVar; //实例变量 Member(int instanceVar) { this.instanceVar = instanceVar; } static void setClassVar(int i) { classVar=i; //instanceVar=i; // cL法不能访问实例变量,只能讉Kcd?br /> } static int getClassVar() {//cL?br /> return classVar; } void setInstanceVar(int i) { classVar=i; //实例Ҏ不但可以讉Kcd量,也可以实例变?br /> instanceVar=i; } int getInstanceVar() { return instanceVar; } } Member未实例化Q?Member实例化之后: 1 对于非静态数据成员,每个cd象都有自q拯。而静态数据成员被当作是类的成员。无个类的对象被定义了多个Q静态数据成员在E序中也只有一份拷贝,pcd的所有对象共享访问。也是_静态数据成员是该类的所有对象所共有的。对该类的多个对象来_静态数据成员只分配一ơ内存,供所有对象共用。所以,静态数据成员的值对每个对象都是一LQ它的值可以更? Member m1 = new Member(); Member m2 = new Member(); 内存分配 2 引用static变量有两U方法。如前例所C,可以通过一个对象去定位它,如m1.classVar; 也可以通过其类名直接引用,如Member.classVarQ而对于非静态成员则不行?br /> 管当static作用于某个字D|Q肯定会改变数据的创建方?因ؓ一个static字段Ҏ个类来说都只有一份存储空_而非static字段则是Ҏ个对象都有一个存储空?Q但是如果static用于某个ҎQ差别却没有那么大。staticҎ的一个重要用法就是在不创ZQ何对象的前提下就可以调用它。这一点,对定义main()Ҏ很重要,q个Ҏ是运行一个应用时的入口点?br /> staticҎ是没有this的方法。在staticҎ的内部不能调用非静态方法,反过来倒是可以的。而且可以在没有创ZQ何对象的前提下,仅仅通过cLw来调用staticҎ。这实际上正是staticҎ的主要用途。它很像全局Ҏ。Java中禁止用全局ҎQ但你在cM|入staticҎ可以访问其他staticҎ和static域?br /> 和其他Q何方法一PstaticҎ可以创徏或用与其类型相同的被命名对象,因此QstaticҎ通常拿来?#8220;牧羊?#8221;的角Ԍ负责看护与其奴隶同一cd的实例群?br /> 不过Q要是在代码中出现大量的staticҎQ就该重新考虑自己的设计了sat{案 www.jszj123.com ]]> 最短\径之Dijkstra法详细讲解 http://www.tkk7.com/haosola/archive/2014/09/10/417810.html好不Ҏ 好不Ҏ Wed, 10 Sep 2014 14:21:00 GMT http://www.tkk7.com/haosola/archive/2014/09/10/417810.html http://www.tkk7.com/haosola/comments/417810.html http://www.tkk7.com/haosola/archive/2014/09/10/417810.html#Feedback 0 http://www.tkk7.com/haosola/comments/commentRss/417810.html http://www.tkk7.com/haosola/services/trackbacks/417810.html 1 最短\径算?br /> 在日常生zMQ我们如果需要常常往qA地区和B地区之间Q我们最希望知道的可能是从A地区到B地区间的众多路径中,那一条\径的路途最短。最短\径问题是图论研究中的一个经典算法问题, 旨在L?q点和路径l成?中两l点之间的最短\径?法具体的Ş式包括: (1)定L的最短\径问题:卛_知v始结点,求最短\径的问题?br /> (2)定l点的最短\径问题:与确定v点的问题相反Q该问题是已知终l结点,求最短\径的问题。在无向图中该问题与定L的问题完全等同,在有向图中该问题{同于把所有\径方向反转的定L的问题?br /> (3)定Ll点的最短\径问题:卛_知v点和l点Q求两结点之间的最短\径?br /> (4)全局最短\径问题:求图中所有的最短\径?br /> 用于解决最短\径问题的法被称?#8220;最短\径算?#8221;Q?有时被简UC“路径法”?最常用的\径算法有QDijkstra法、A*法、Bellman-Ford法、Floyd-Warshall法、Johnson法?br /> 本文主要研究Dijkstra法的单源算法?br /> 2 Dijkstra法 2.1 Dijkstra法 Dijkstra法是典型最短\法Q用于计一个节点到其他所有节点的最短\径。主要特Ҏ以v始点Z心向外层层扩展,直到扩展到终点ؓ止。Dijkstra法能得出最短\径的最优解Q但׃它遍历计的节点很多Q所以效率低?br /> Dijkstra法是很有代表性的最短\法Q在很多专业评中都作ؓ基本内容有详l的介绍Q如数据l构Q图论,q筹学等{?br /> 2.2 Dijkstra法思想 Dijkstra法思想为:设G=(V,E)是一个带权有向图Q把图中点集合V分成两组Q第一lؓ已求出最短\径的点集合(用S表示Q初始时S中只有一个源点,以后每求得一条最短\?, 将 加入到集合S中,直到全部点都加入到S中,法q束了)Q第二组为其余未定最短\径的点集合(用U表示)Q按最短\径长度的递增ơ序依次把第二组的顶点加入S中。在加入的过E中QM持从源点v到S中各点的最短\径长度不大于从源点v到U中Q何顶点的最短\径长度。此外,每个点对应一个距,S中的点的距d是从v到此点的最短\径长度,U中的点的距,是从v到此点只包括S中的点Z间顶点的当前最短\径长?strong>sat{案 www.jszj123.com 2.3 Dijkstra法具体步骤 (1)初始ӞS只包含源点,即S=Qv的距Mؓ0。U包含除v外的其他点QU中顶点u距离上的?若v与u有边)?)(若u不是v的出辚w接点)?br /> (2)从U中选取一个距v最的点kQ把kQ加入S?该选定的距d是v到k的最短\径长??br /> (3)以k为新考虑的中间点Q修改U中各点的距?若从源点v到顶点u(u U)的距?l过点k)比原来距?不经q顶点k)短,则修攚w点u的距d|修改后的距离值的点k的距d上边上的权?br /> (4)重复步骤(2)?3)直到所有顶炚w包含在S中?br /> 2.4 Dijkstra法举例说明 如下图,设A为源点,求A到其他各点(B、C、D、E、F)的最短\径。线上所标注为相ȝD之间的距离Q即权倹{?注:此图为随意所画,其相邻顶炚w的距M图中的目视长度不能一一对等) 图一QDijkstra无向?img border="0" alt="" src="http://www.tkk7.com/images/blogjava_net/haosola/1.jpg" width="345" height="204" /> 法执行步骤如下表:【注Q图片要是看不到请到“相册--日志相册”中,名ؓ“Dijkstra法q程”的图是了?br /> ]]> Java实现ȝE等待子U程 http://www.tkk7.com/haosola/archive/2014/08/25/417317.html好不Ҏ 好不Ҏ Mon, 25 Aug 2014 14:00:00 GMT http://www.tkk7.com/haosola/archive/2014/08/25/417317.html http://www.tkk7.com/haosola/comments/417317.html http://www.tkk7.com/haosola/archive/2014/08/25/417317.html#Feedback 0 http://www.tkk7.com/haosola/comments/commentRss/417317.html http://www.tkk7.com/haosola/services/trackbacks/417317.html 本文介绍两种ȝE等待子U程的实现方式,?个子U程来说明: 1、用Thread的joinQ)ҎQjoinQ)Ҏ会阻塞主U程l箋向下执行?br /> 2、用java.util.concurrent中的CountDownLatch,是一个倒数计数器。初始化时先讄一个倒数计数初始|每调用一ơcountDownQ)ҎQ倒数值减一Q他的awaitQ)Ҏ会阻塞当前进E,直到倒数?. join方式代码如下Q?br /> package com.test.thread; import java.util.ArrayList; import java.util.List; public class MyThread extends Thread { public MyThreadQString nameQ?br /> { this.setNameQnameQ; } @Override public void runQ) { System.out.printlnQthis.getNameQ) + " staring…"Q; System.out.printlnQthis.getNameQ) + " end…"Q; } /** * @param args */ public static void mainQString[] argsQ?br /> { System.out.printlnQ?main thread starting…"Q; List<MYTHREAD> list = new ArrayList<MYTHREAD>Q)Q?br /> for Qint i = 1; i <= 5; i++Q?br /> { MyThread my = new MyThreadQ?Thrad " + iQ; my.startQ)Q?br /> list.addQmyQ; } try { for QMyThread my : listQ?br /> { my.joinQ)Q?br /> } } catch QInterruptedException eQ?br /> { e.printStackTraceQ)Q?br /> } System.out.printlnQ?main thread end…"Q; } } q行l果如下Q?br /> main thread starting… Thrad 2 staring… Thrad 2 end… Thrad 4 staring… Thrad 4 end… Thrad 1 staring… Thrad 1 end… Thrad 3 staring… Thrad 3 end… Thrad 5 staring… Thrad 5 end… main thread end… CountDownLatch方式代码如下Q?br /> package com.test.thread; import java.util.concurrent.CountDownLatch; public class MyThread2 extends Thread { private CountDownLatch count; public MyThread2QCountDownLatch count, String nameQ?br /> { this.count = count; this.setNameQnameQ; } @Override public void runQ) { System.out.printlnQthis.getNameQ) + " staring…"Q; System.out.printlnQthis.getNameQ) + " end…"Q; this.count.countDownQ)Q?br /> } /** * @param args */ public static void mainQString[] argsQ?br /> { System.out.printlnQ?main thread starting…"Q; CountDownLatch count = new CountDownLatchQ?Q; for Qint i = 1; i <= 5; i++Q?br /> { MyThread2 my = new MyThread2Qcount, "Thread " + iQ; my.startQ)Q?br /> } try { count.awaitQ)Q?br /> } catch QInterruptedException eQ?br /> { e.printStackTraceQ)Q?br /> } System.out.printlnQ?main thread end…"Q; } } q行l果如下Q?br /> main thread starting… Thread 2 staring… Thread 2 end… Thread 4 staring… Thread 4 end… Thread 1 staring… Thread 1 end… Thread 3 staring… Thread 3 end… Thread 5 staring… Thread 5 end… main thread end…托福{案 ]]> Java下static关键字用法详?/title> http://www.tkk7.com/haosola/archive/2014/08/25/417315.html好不Ҏ 好不Ҏ Mon, 25 Aug 2014 13:54:00 GMT http://www.tkk7.com/haosola/archive/2014/08/25/417315.html http://www.tkk7.com/haosola/comments/417315.html http://www.tkk7.com/haosola/archive/2014/08/25/417315.html#Feedback 0 http://www.tkk7.com/haosola/comments/commentRss/417315.html http://www.tkk7.com/haosola/services/trackbacks/417315.html Java下static关键字用法详?br /> 本文章介l了java下static关键字的用法Q大部分内容摘自原作者,在此学习q分享给大家?br /> Static关键字可以修C? 从以下测试可以看出, static 可以修饰: 1. 语句?br /> 2. 成员变量(但是不能修饰局部变? 3. Ҏ 4. 接口(内部接口) 5. c?只能修饰在类中的c, 即静态内部类) 6. jdk 1.5 中新增的静态导?br /> 那么static 修饰的表CZ么呢? 当创Z个类Ӟ是在创Z个新cdQ描q这个类的对象的外观和行为,除非用new创徏出那个类的对象,数据存储I间才被分配Q其Ҏ才供外界调用。那么当声明一个事物ؓstaticӞ意味着q个域或者方法不会与包含它的那个cȝM对象兌在一P也就是说Q它不依赖类特定的实例,被类的所有实例共享,只要q个c被加蝲QJava虚拟机就能根据类名在q行时数据区的方法区内定扑ֈ他们。因此,static对象可以在它的Q何对象创Z前访问,无需引用M对象?br /> 1. static 修饰语句? static{} 可以有多处,执行序按照他们的声明顺序。当JVM加蝲q个cȝ时候,׃执行此语句块Qƈ且只执行一ơ?br /> 2. static 变量: static 变量Q可以被cȝ所有对象共享,q且它只有一份存储空_JVM只ؓ静态分配一ơ内存,在加载类的过E中完成静态变量的内存分配。那么在引用static变量的时候,使用(cd.变量?是首选的方式Q因Z不仅它是staticl构Q而且在某些情况下会ؓ~译器进行优化提供更好的Z?br /> 使用cd直接引用static变量是比较力荐的Q这样就很明的告诉大家该变量或属性是staticl构或是被static修饰?br /> 但是我想说一个更重要的知识点。static 在类中当变量的重要用方法,首先g先运行一下下面代码试试: public class Person { static int[] arr = new int[3]; public static void main(String[] args){ Person per1 = new Person(); Person per2 = new Person(); Person per3 = new Person(); System.out.println("----改变之前-----"); System.out.print("per1-->"); per1.show(); System.out.print("per2-->"); per2.show(); System.out.print("per3-->"); per3.show(); //现在我改变它的?br /> Person.arr[2]=10;//q种Ҏ是徏议的 per1.arr[0]=1;//一般不用这U方?br /> System.out.println("----改变之后-----"); System.out.print("per1-->"); per1.show(); System.out.print("per2-->"); per2.show(); System.out.print("per3-->"); per3.show(); } //Z方便Q封装一个方法,来解?br /> public void show(){ for(int i=0; i System.out.print(arr[i] + "t"); } System.out.println(""); } }OutputQ?br /> ----改变之前----- per1-->0t0t0t per2-->0t0t0t per3-->0t0t0t ----改变之后----- per1-->1t0t10t per2-->1t0t10t per3-->1t0t10t cM的Ş式同样应用在使用static修饰的方法上?UCؓ静态方?。它可以像普通方法一样用对象来引用Q也可以通过Ҏ的语法Ş式来调用如:“cd”+“ . ”+“Ҏ”(); 定义静态方法的方式与定义静态变量一P public class StaticTest2 { static void method(){ ("q是静态方?); } } 普通的调用ҎQStaticTest2 st = new StaticTest2(); 因ؓmethod是static修饰?静态方?Q所以可以这栯用:StaticTest2.()?br /> 3. staticҎ: staticҎ与非staticҎ的区别在? staticҎ可以用类名直接访问在static内部的变量和ҎQ而不能引用非static的变量或者方法,但是你可以通过传递参数的方式传递一个引用,让这个引用去调用非静态数据?br /> 4. static 接口: 内部接口(inner interface)本n默认是staticQ所以static关键词加与不加都是一LQ?如此例中的接?TestInInterfaceQTestInClass 实现此接口, 以下语句Q?br /> StaticDescription.TestInInterface a = new StaticDescription.TestInClass(); a.print(); 我们Lstatic关键字也是一LQ?但还是受讉K权限控制TestInterface和FF?br /> 5. static 修饰c? 表示它是一个静态内部类Q它在引用外部类的事物时Q必M是static的。而且Q?静态内部类在创q对象Ӟ 是不需要外围类的存在。就好像下面的部分: class Member { static int classVar = 0; //cd?br /> int instanceVar; //实例变量 Member(int instanceVar) { this.instanceVar = instanceVar; } static void setClassVar(int i) { classVar=i; //instanceVar=i; // cL法不能访问实例变量,只能讉Kcd?br /> } static int getClassVar() {//cL?br /> return classVar; } void setInstanceVar(int i) { classVar=i; //实例Ҏ不但可以讉Kcd量,也可以实例变?br /> instanceVar=i; } int getInstanceVar() { return instanceVar; } } Member未实例化Q?Member实例化之后: 1 对于非静态数据成员,每个cd象都有自q拯。而静态数据成员被当作是类的成员。无个类的对象被定义了多个Q静态数据成员在E序中也只有一份拷贝,pcd的所有对象共享访问。也是_静态数据成员是该类的所有对象所共有的。对该类的多个对象来_静态数据成员只分配一ơ内存,供所有对象共用。所以,静态数据成员的值对每个对象都是一LQ它的值可以更?strong>托福{案 Member m1 = new Member(); Member m2 = new Member(); 内存分配 2 引用static变量有两U方法。如前例所C,可以通过一个对象去定位它,如m1.classVar; 也可以通过其类名直接引用,如Member.classVarQ而对于非静态成员则不行?br /> 管当static作用于某个字D|Q肯定会改变数据的创建方?因ؓ一个static字段Ҏ个类来说都只有一份存储空_而非static字段则是Ҏ个对象都有一个存储空?Q但是如果static用于某个ҎQ差别却没有那么大。staticҎ的一个重要用法就是在不创ZQ何对象的前提下就可以调用它。这一点,对定义main()Ҏ很重要,q个Ҏ是运行一个应用时的入口点?br /> staticҎ是没有this的方法。在staticҎ的内部不能调用非静态方法,反过来倒是可以的。而且可以在没有创ZQ何对象的前提下,仅仅通过cLw来调用staticҎ。这实际上正是staticҎ的主要用途。它很像全局Ҏ。Java中禁止用全局ҎQ但你在cM|入staticҎ可以访问其他staticҎ和static?strong>托福{案 和其他Q何方法一PstaticҎ可以创徏或用与其类型相同的被命名对象,因此QstaticҎ通常拿来?#8220;牧羊?#8221;的角Ԍ负责看护与其奴隶同一cd的实例群?br /> 不过Q要是在代码中出现大量的staticҎQ就该重新考虑自己的设计了 ]]> Java多线E中使用synchronized说明 http://www.tkk7.com/haosola/archive/2014/05/15/413682.html好不Ҏ 好不Ҏ Thu, 15 May 2014 03:35:00 GMT http://www.tkk7.com/haosola/archive/2014/05/15/413682.html http://www.tkk7.com/haosola/comments/413682.html http://www.tkk7.com/haosola/archive/2014/05/15/413682.html#Feedback 0 http://www.tkk7.com/haosola/comments/commentRss/413682.html http://www.tkk7.com/haosola/services/trackbacks/413682.html 1.在类中方法上加上 synchronized关键字,是对整个对象加锁Q当一个线E访问带有synchronized的方法时Q其他带有synchronized的方法的讉K都会阻塞?br /> 样例Q?br /> public class ThreadTest { public static void mainQString[] argsQ?{ Stu stu = new StuQ)Q?br /> StuThread1 t1 = new StuThread1QstuQ; t1.startQ)Q?br /> StuThread2 t2 = new StuThread2QstuQ; t2.startQ)Q?br /> } } class StuThread1 extends Thread { Stu stu; public StuThread1QStu stuQ?{ this.stu = stu; } public void runQ) { stu.read1Q)Q?br /> } } class StuThread2 extends Thread { Stu stu; public StuThread2QStu stuQ?{ this.stu = stu; } public void runQ) { stu.read2Q)Q?br /> } } class Stu { public synchronized void read1Q) { System.out.printlnQ?read1 begin"Q; try { Thread.currentThreadQ)。sleepQ?000Q; } catch QInterruptedException eQ?{ e.printStackTraceQ)Q?br /> } System.out.printlnQ?read1 end"Q; } public synchronized void read2Q) { System.out.printlnQ?read2 begin"Q; try { Thread.currentThreadQ)。sleepQ?000Q; } catch QInterruptedException eQ?{ e.printStackTraceQ)Q?br /> } System.out.printlnQ?read2 end"Q; } } 打印l果为(两个U程是顺序执行的Q: read1 begin read1 end read2 begin read2 end 如果Lread2前面的synchronized关键字,打印为(U程出现了交叉执行)Q?br /> read1 begin read2 begin read2 end read1 end 修改read2ҎQ?br /> public void read2Q) { synchronizedQthisQ?br /> { System.out.printlnQ?read2 begin"Q; try { Thread.currentThreadQ)。sleepQ?000Q; } catch QInterruptedException eQ?{ e.printStackTraceQ)Q?br /> } System.out.printlnQ?read2 end"Q; } } 对thisq行加锁Q结果同一ơ,U程是顺序执行的托福{案 ]]> Java实现快速批量移动文?/title> http://www.tkk7.com/haosola/archive/2014/05/15/413680.html好不Ҏ 好不Ҏ Thu, 15 May 2014 03:29:00 GMT http://www.tkk7.com/haosola/archive/2014/05/15/413680.html http://www.tkk7.com/haosola/comments/413680.html http://www.tkk7.com/haosola/archive/2014/05/15/413680.html#Feedback 0 http://www.tkk7.com/haosola/comments/commentRss/413680.html http://www.tkk7.com/haosola/services/trackbacks/413680.html Java实现快速批量移动文?br /> 文gUd是计机资源理常用的一个操作,q在操作pȝ中可以通过文g的剪切与复制或鼠标拖动来实现。但是在Java文g的编E实CQ大多是通过复制文g到目的地Q再删除所有文件来实现的。这对于文件来说看不出什么弊端,但是如果Ud几个大的文gQ则会操作~慢q且费pȝ资源。本实例通过FilecȝrenameTo()Ҏ直接实现文g的快速移动,哪怕是Ud几GB的文件也不会需要等待太长时间?br /> 思\分析Q?br /> 首先是视囑ֱ。在q里有个Q因为在某些控g的事件中Q常怼讉K其他控gQ且控g的事件方法用到的参数几乎是固定的ActionEventc,很少传递别的参数。因此即使视图是用拖动控件自动生成的Q也要在代码中把q些控g设ؓcȝ成员变量。在本实例中Q要用到JPanel控g作ؓ其他控g的容器,JLabel控g用来昄固定信息QJTextField控g用来昄要移动的文g和目标文件夹QJButton控g用来选择源文件夹、目标文件夹以及实现Ud和关闭程序,JScrollPane用来昄条Ş柱,以及JTextArea控g用来昄操作记录托福{案 然后是模型层。对于浏览按钮,要获取源文g夹中的文件名数组和目标文件夹的\径,q就需要定义一个File型数l成员变量保存文件名Q再定义一个File型成员变量保存目标\径?br /> 选择源文件的览按钮后,首先创徏一个JFileChooser文g选择器,使用JFileChoosercȝsetMultiSelectionEnabled(true);Ҏ讄可以多选,通过JFileChoosercȝshowOpenDialog(this);Ҏ昄文g选择对话框,若用L认则使用JFileChoosercȝgetSelectedFiles()Ҏ获取选中的文件数lƈ赋值给之前定义的File型数l成员变量,通过JTextField()cȝsetText("")Ҏ清空文本框以除去上一ơ操作的记录Q新Z个StringBuilder对象Q用foreach()循环遍历文g数组Q通过StringBuildercȝappend()Ҏq接文g名称Q因为最前面多了?#8220;?#8221;Q再使用StringBuildercȝsubstring()Ҏ获取所有文件名U的字符Ԍ通过JTextFieldlcȝsetText()Ҏ文件名U字W串昄到文本框?br /> 对于选择目标文g夹的览按钮Q首先创Z个JFileChooser文g选择器,使用JFileChoosercȝsetFileSelectionMode()Ҏ讄选择器只Ҏ件夹生效Q通过JFileChoosercȝshowOpenDialog()Ҏ昄文g打开对话框,使用JFileChoosercȝgetSelectedFile()Ҏ获取选择的文件夹Q最后用JTextField控g的setText()Ҏ昄文g夹到文本框?br /> 对于Ud按钮的事件处理方法,首先使用数组的length属性判断文件数l有无元素,若有则用foreach()循环遍历文g数组Q对数组中的每一个文件元素创建移动目标文Ӟ通过JTextArea控g的append()Ҏ昄Ud记录Q用FilecȝrenameTo()Ҏ实现文gUdQ最后用JTextArea控g的append()Ҏ昄Ud完成信息?br /> 对于关闭按钮的事件处理方法,使用Systemcȝexit()Ҏ退出程序?br /> 代码如下Q?br /> import java.awt.EventQueue; public class QuickMoveFiles extends JFrame { /** * */ private static final long serialVersionUID = -666045931923008374L; private JPanel contentPane; private JTextArea infoArea; private JTextField sourceFolderField; private JTextField targetFolderField; private File[] files; private File dir; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { QuickMoveFiles frame = new QuickMoveFiles(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public QuickMoveFiles() { setTitle("\u5FEB\u901F\u6279\u91CF\u79FB\u52A8\u6587\u4EF6"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 507, 299); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); GridBagLayout gbl_contentPane = new GridBagLayout(); gbl_contentPane.columnWidths = new int[] { 0, 178, 0, 0, 0, 0 }; gbl_contentPane.rowHeights = new int[] { 0, 0, 169, 0, 0 }; gbl_contentPane.columnWeights = new double[] { 0.0, 1.0, 0.0, 0.0, 0.0, Double.MIN_VALUE }; gbl_contentPane.rowWeights = new double[] { 0.0, 0.0, 1.0, 0.0, Double.MIN_VALUE }; contentPane.setLayout(gbl_contentPane); JLabel label = new JLabel("\u9009\u62E9\u6E90\u6587\u4EF6\uFF1A"); GridBagConstraints gbc_label = new GridBagConstraints(); gbc_label.anchor = GridBagConstraints.EAST; gbc_label.insets = new Insets(0, 0, 5, 5); gbc_label.gridx = 0; gbc_label.gridy = 0; contentPane.add(label, gbc_label); sourceFolderField = new JTextField(); GridBagConstraints gbc_sourceFolderField = new GridBagConstraints(); gbc_sourceFolderField.gridwidth = 3; gbc_sourceFolderField.insets = new Insets(0, 0, 5, 5); gbc_sourceFolderField.fill = GridBagConstraints.HORIZONTAL; gbc_sourceFolderField.gridx = 1; gbc_sourceFolderField.gridy = 0; contentPane.add(sourceFolderField, gbc_sourceFolderField); sourceFolderField.setColumns(10); JButton browserButton1 = new JButton("\u6D4F\u89C8"); browserButton1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { do_browserButton1_actionPerformed(e); } }); GridBagConstraints gbc_browserButton1 = new GridBagConstraints(); gbc_browserButton1.insets = new Insets(0, 0, 5, 0); gbc_browserButton1.gridx = 4; gbc_browserButton1.gridy = 0; contentPane.add(browserButton1, gbc_browserButton1); JLabel label_1 = new JLabel( "\u9009\u62E9\u76EE\u6807\u6587\u4EF6\u5939\uFF1A"); GridBagConstraints gbc_label_1 = new GridBagConstraints(); gbc_label_1.anchor = GridBagConstraints.EAST; gbc_label_1.insets = new Insets(0, 0, 5, 5); gbc_label_1.gridx = 0; gbc_label_1.gridy = 1; contentPane.add(label_1, gbc_label_1); targetFolderField = new JTextField(); GridBagConstraints gbc_targetFolderField = new GridBagConstraints(); gbc_targetFolderField.gridwidth = 3; gbc_targetFolderField.insets = new Insets(0, 0, 5, 5); gbc_targetFolderField.fill = GridBagConstraints.HORIZONTAL; gbc_targetFolderField.gridx = 1; gbc_targetFolderField.gridy = 1; contentPane.add(targetFolderField, gbc_targetFolderField); targetFolderField.setColumns(10); JButton browserButton2 = new JButton("\u6D4F\u89C8"); browserButton2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { do_browserButton2_actionPerformed(e); } }); GridBagConstraints gbc_browserButton2 = new GridBagConstraints(); gbc_browserButton2.insets = new Insets(0, 0, 5, 0); gbc_browserButton2.gridx = 4; gbc_browserButton2.gridy = 1; contentPane.add(browserButton2, gbc_browserButton2); JLabel label_2 = new JLabel("\u64CD\u4F5C\u8BB0\u5F55\uFF1A"); GridBagConstraints gbc_label_2 = new GridBagConstraints(); gbc_label_2.anchor = GridBagConstraints.EAST; gbc_label_2.insets = new Insets(0, 0, 5, 5); gbc_label_2.gridx = 0; gbc_label_2.gridy = 2; contentPane.add(label_2, gbc_label_2); JScrollPane scrollPane = new JScrollPane(); GridBagConstraints gbc_scrollPane = new GridBagConstraints(); gbc_scrollPane.gridwidth = 4; gbc_scrollPane.insets = new Insets(0, 0, 5, 0); gbc_scrollPane.fill = GridBagConstraints.BOTH; gbc_scrollPane.gridx = 1; gbc_scrollPane.gridy = 2; contentPane.add(scrollPane, gbc_scrollPane); infoArea = new JTextArea(); scrollPane.setViewportView(infoArea); JButton moveButton = new JButton("\u79FB\u52A8"); moveButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { do_moveButton_actionPerformed(e); } }); GridBagConstraints gbc_moveButton = new GridBagConstraints(); gbc_moveButton.insets = new Insets(0, 0, 0, 5); gbc_moveButton.gridx = 1; gbc_moveButton.gridy = 3; contentPane.add(moveButton, gbc_moveButton); JButton closeButton = new JButton("\u5173\u95ED"); closeButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { do_closeButton_actionPerformed(e); } }); GridBagConstraints gbc_closeButton = new GridBagConstraints(); gbc_closeButton.insets = new Insets(0, 0, 0, 5); gbc_closeButton.gridx = 2; gbc_closeButton.gridy = 3; contentPane.add(closeButton, gbc_closeButton); } /** * 选择源文件的览按钮 * * @param e */ protected void do_browserButton1_actionPerformed(ActionEvent e) { JFileChooser chooser = new JFileChooser();// 创徏文g选择?br /> chooser.setMultiSelectionEnabled(true);// 讄文g多?br /> int option = chooser.showOpenDialog(this);// 昄文g打开对话?br /> if (option == JFileChooser.APPROVE_OPTION) { files = chooser.getSelectedFiles();// 获取选择的文件数l?br /> sourceFolderField.setText("");// 清空文本?br /> StringBuilder filesStr = new StringBuilder(); for (File file : files) {// 遍历文g数组托福{案 filesStr.append("? + file.getName());// q接文g名称 } String str = filesStr.substring(1);// 获取所有文件名U的字符?br /> sourceFolderField.setText(str);// 讄文g名称信息到文本框 } else { files = new File[0]; sourceFolderField.setText("");// 清空文本?br /> } } /** * 选择目标文g夹的览按钮 * * @param e */ protected void do_browserButton2_actionPerformed(ActionEvent e) { JFileChooser chooser = new JFileChooser();// 创徏文g选择?br /> // 讄选择器只针对文g夹生?br /> chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); int option = chooser.showOpenDialog(this);// 昄文g打开对话?br /> if (option == JFileChooser.APPROVE_OPTION) { dir = chooser.getSelectedFile();// 获取选择的文件夹 targetFolderField.setText(dir.toString());// 昄文g夹到文本?br /> } else { dir = null; targetFolderField.setText(""); } } /** * 关闭按钮的事件处理方?br /> * * @param e */ protected void do_closeButton_actionPerformed(ActionEvent e) { System.exit(0); } /** * Ud按钮的事件处理方?br /> * * @param e */ protected void do_moveButton_actionPerformed(ActionEvent e) { if (files.length <= 0 || dir == null)// 判断文g数组有无元素 return; for (File file : files) {// 遍历文g数组托福{案 File newFile = new File(dir, file.getName());// 创徏Ud目标文g infoArea.append(file.getName() + "\tUd到\t" + dir);// 昄Ud记录 file.renameTo(newFile);// 文gUd infoArea.append("------完成\n");// 昄Ud完成信息 } // 昄操作完成 infoArea.append("##################操作完成###################\n"); } } ]]> Java基础巩固之线E学?/title> http://www.tkk7.com/haosola/archive/2014/04/26/412957.html好不Ҏ 好不Ҏ Sat, 26 Apr 2014 05:38:00 GMT http://www.tkk7.com/haosola/archive/2014/04/26/412957.html http://www.tkk7.com/haosola/comments/412957.html http://www.tkk7.com/haosola/archive/2014/04/26/412957.html#Feedback 0 http://www.tkk7.com/haosola/comments/commentRss/412957.html http://www.tkk7.com/haosola/services/trackbacks/412957.html 一、线E的学习 U程是E序中执行单个Q务的序的流E?br /> U程创徏的两U方式: 1、承Threadc?br /> publicstaticvoidmainQString[]argsQ?br /> { //l承Threadc覆盖父crunҎ Threadthread=newThreadQ) { @Override publicvoidrunQ) { whileQtrueQ?br /> { System.out.printlnQThread.currentThreadQ)。getNameQ)Q; } } }; thread.startQ)Q?br /> } 2、实现Runnable接口的runҎ publicstaticvoidmainQString[]argsQ?br /> { Threadthread=newThreadQnewRunnableQ) { @Override publicvoidrunQ) { whileQtrueQ?br /> { System.out.printlnQThread.currentThreadQ)。getNameQ)Q; } } }Q; thread.startQ)Q?br /> } ȝQ以上是Java实现多线E的两种方式Q承ThreadcdRunnable接口Q由于Javacȝ单承性,接口又可以实现多l承以及使用Runnable接口可以很好地将需要执行的d代码与线E类分离Q所以推荐用实现Runnable接口的方法去实现多ѝ但不管怎样最l都需要用Thread.startQ)Ҏ来ɾU程处于可运行状态吐舌头 3、线E中startQ) Ҏ与runQ) Ҏ的区?strong>托福{案 1、startQ)Ҏ 调用startQ)Ҏ是Z告诉pȝ我这儿有一个线E已l处于可q行状态,q没有开始运行,如果cpu分配了时间片Q那么JVM׃调用本线E的runQ)Ҏ来运行线E;runQ)Ҏ一旦执行结束,则本U程l止?br /> 2、runQ)Ҏ runQ)Ҏ只是cȝ一个普通方法,如果直接调用runQ)ҎQ那么程序中只会存在一个主U程Q在调用runQ)Ҏ以后的代码,必须{待runQ)Ҏ执行完成后才能执行,直接调用其他普通方法一h有区?strong>雅思答?/font> ȝQ调用startQ)Ҏ可以开启一个新的线E,q在新的U程中运行runQ)ҎQ而直接调用runQ)Ҏ则不会开启新U程QrunQ)Ҏq是执行于主U程中?br /> 4.U程的运行结?br /> public static void mainQString[] argsQ?br /> { Thread thread = new ThreadQnew RunnableQ) { //实现了Runnable接口的runQ)Ҏ @Override public void runQ) { System.out.printlnQ?Runnable:" + Thread.currentThreadQ)。getNameQ)Q; } }Q?br /> { //l承了Threadc?q覆盖了ThreadcȝrunQ)Ҏ @Override public void runQ) { System.out.printlnQ?Thread:" + Thread.currentThreadQ)。getNameQ)Q; } }; thread.startQ)Q?br /> } ȝQThread的子c覆盖了父类的runQ)ҎQ所以执行了子类的runQ)ҎQ在子类的runQ)Ҏ中又没有调用传入的接口实现类的runQ)Ҏ?/p> ]]> 在旋转有序数l内扄定的?/title> http://www.tkk7.com/haosola/archive/2014/04/26/412956.html好不Ҏ 好不Ҏ Sat, 26 Apr 2014 05:33:00 GMT http://www.tkk7.com/haosola/archive/2014/04/26/412956.html http://www.tkk7.com/haosola/comments/412956.html http://www.tkk7.com/haosola/archive/2014/04/26/412956.html#Feedback 0 http://www.tkk7.com/haosola/comments/commentRss/412956.html http://www.tkk7.com/haosola/services/trackbacks/412956.html 要求 l定一没有重复元素的旋转数l(它对应的原数l是有序的)Q求l定元素在旋转数l内的下标(不存在的q回-1Q?br /> 例如 有序数组为{0,1,2,4,5,6,7},它的一个旋转数lؓ{4,5,6,7,0,1,2}. 元素6在旋转数l内Q返? 元素3不在旋{数组内,q回-1 分析托福{案 遍历一遍,可以L搞定Q时间复杂度为OQnQ,因ؓ是有序数l旋转得刎ͼq样做肯定不是最优解。有序,本能反映用二分查找,举个例子看看特点 可以看出中间位置两段L有一个是有序的(不是左边Q就是右边)Q那么就可以在有序的范围内用二分查找;如果不再有序范围内,到另一半去找?br /> 参考代?br /> 复制代码 int searchQint A[], int n, int targetQ?{ int beg = 0; int end = n - 1; while Qbeg <= endQ?br /> { int mid = beg + Qend - begQ?/ 2; ifQA[mid] == targetQ?br /> return mid; ifQA[beg] <= A[mid]Q?br /> { ifQA[beg] <= target && target < A[mid]Q?br /> end = mid - 1; else beg = mid + 1; } else { ifQA[mid] < target && target <= A[end]Q?br /> beg = mid + 1; else end = mid - 1; } } return -1; } 复制代码 扩展 上边的有求是没有重复的元素,现在E微扩展下,可以有重复的元素Q其他的要求不变?br /> 思\雅思答?/font> 大致思\与原来相同,q是需要比较A[beg] ?A[mid]的关p?br /> A[beg] < A[mid] ----左边有序 A[beg] > A[mid] ----双有序 A[beg] = A[mid] ----++beg 复制代码 bool searchQint A[], int n, int targetQ?{ int beg = 0; int end = n - 1; while Qbeg <= endQ?br /> { int mid = beg + Qend - begQ?/ 2; ifQA[mid] == targetQ?br /> return true; ifQA[beg] < A[mid]Q?br /> { ifQA[beg] <= target && target < A[mid]Q?br /> end = mid - 1; else beg = mid + 1; } else ifQA[beg] > A[mid]Q?br /> { ifQA[mid] < target && target <= A[end]Q?br /> beg = mid + 1; else end = mid - 1; } else ++beg; } return false; } ]]> java webpȝU初始化工作 http://www.tkk7.com/haosola/archive/2014/04/20/412698.html好不Ҏ 好不Ҏ Sun, 20 Apr 2014 01:23:00 GMT http://www.tkk7.com/haosola/archive/2014/04/20/412698.html http://www.tkk7.com/haosola/comments/412698.html http://www.tkk7.com/haosola/archive/2014/04/20/412698.html#Feedback 0 http://www.tkk7.com/haosola/comments/commentRss/412698.html http://www.tkk7.com/haosola/services/trackbacks/412698.html 通常我们在做web开发时Q有些系l参数希望在web启动时就q行一ơ性初始化Q供整个工程调用使用。如Q系l配|参敎ͼ可以结合hibernate二~存Q进行一ơ性获取ƈq行׃n。这时就可以采用监听?br /> ServletContext ?Servlet E序用来?Web 容器通信。例如写日志Q{发请求。每一?Web 应用E序含有一个Context,被Web应用内的各个E序׃n。因为Context可以用来保存资源q且׃nQ所以我所知道?ServletContext 的最大应用是Web~存----把不l常更改的内容读入内存,所以服务器响应h的时候就不需要进行慢速的盘I/O了?br /> ServletContextListener ?ServletContext 的监听者,如果 ServletContext 发生变化Q如服务器启动时 ServletContext 被创建,服务器关闭时 ServletContext 要被销毁?br /> 在JSP文g中,application ?ServletContext 的实例,由JSP容器默认创徏。Servlet 中调?getServletContextQ)Ҏ得到 ServletContext 的实例?br /> 我们使用~存的思\大概是: 服务器启动时QServletContextListener ?contextInitializedQ)Ҏ被调用,所以在里面创徏好缓存。可以从文g中或者从数据库中d取缓存内容生成类Q用 ervletContext.setAttributeQ)Ҏ缓存类保存?ServletContext 的实例中?br /> E序使用 ServletContext.getAttributeQ)d~存。如果是 JSP,使用a pplication.getAttributeQ)。如果是 Servlet,使用 getServletContextQ)。getAttributeQ)。如果缓存发生变化(如访问计敎ͼQ你可以同时更改~存和文?数据库。或者你{变化积累到一定程序再保存Q也可以在下一步保?strong>托福{案 服务器将要关闭时QServletContextListener ?contextDestroyedQ)Ҏ被调用,所以在里面保存~存的更攏V将更改后的~存保存回文件或者数据库Q更新原来的内容?br /> 利用Servlet 容器的特性我们可以更优雅的实现系l的初始化工作?我们可以写一个listener让它实现ServletContextListener接口Q在contextInitializedQ)Ҏ中做惛_的事情。将此listener配置到web.xml中,Servlet容器如tomcat会在启动该web应用E序时调用此Ҏ?br /> 1. projectInit.java 文g package com.zzcatv.util; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.http.HttpServletRequest; public class projectInit implements ServletContextListener { HttpServletRequest request; public void contextDestroyedQServletContextEvent arg0Q?{ // TODO Auto-generated method stub System.out.printlnQ?==========初始化信息进行销?========="Q; } public void contextInitializedQServletContextEvent arg0Q?{ // TODO Auto-generated method stub System.out.printlnQ?==========pȝ初始?========="Q; request.getSessionQ)。setAttributeQ?User", "yangguozhi"Q; // 初始化系l全局变量 // … // 加蝲自定义配|文?br /> // … // 启动定时d // … } } 2.web.xml com.zzcatv.util.projectInit 以上实Cpȝ的初始化工作?/p> ]]> Java中测试异常的多种方式 http://www.tkk7.com/haosola/archive/2014/04/20/412697.html好不Ҏ 好不Ҏ Sun, 20 Apr 2014 01:20:00 GMT http://www.tkk7.com/haosola/archive/2014/04/20/412697.html http://www.tkk7.com/haosola/comments/412697.html http://www.tkk7.com/haosola/archive/2014/04/20/412697.html#Feedback 0 http://www.tkk7.com/haosola/comments/commentRss/412697.html http://www.tkk7.com/haosola/services/trackbacks/412697.html 使用JUnit来测试Java代码中的异常有很多种方式Q你知道几种Q?br /> l定q样一个class. Person.java public class Person { private String name; private int age; public String getNameQ) { return name; } public void setNameQString nameQ?{ this.name = name; } public int getAgeQ) { return age; } public void setAgeQint ageQ?{ if Qage < 0 Q?{ throw new IllegalArgumentExceptionQ?age is invalid"Q; } this.age = age; } } 我们来测试setAgeҎ?br /> Try-catch 方式 @Test public void shouldGetExceptionWhenAgeLessThan0Q) { Person person = new PersonQ)Q?br /> try { person.setAgeQ?1Q; failQ?should get IllegalArgumentException"Q; } catch QIllegalArgumentException exQ?{ assertThatQex.getMessageQ)QcontainsStringQ?age is invalid"Q)Q?br /> } } q是最Ҏ惛_的一U方式,但是太啰嗦?br /> JUnit annotation方式托福{案 www.qcwy123.com JUnit中提供了一个expected的annotation来检查异常?br /> @TestQexpected = IllegalArgumentException.classQ?br /> public void shouldGetExceptionWhenAgeLessThan0Q) { Person person = new PersonQ)Q?br /> person.setAgeQ?1Q; } q种方式看v来要z多了,但是无法查异怸的消息?br /> ExpectedException rule JUnit7以后提供了一个叫做ExpectedException的Rule来实现对异常的测试?br /> @Rule public ExpectedException exception = ExpectedException.noneQ)Q?br /> @Test public void shouldGetExceptionWhenAgeLessThan0Q) { Person person = new PersonQ)Q?br /> exception.expectQIllegalArgumentException.classQ; exception.expectMessageQcontainsStringQ?age is invalid"Q)Q?br /> person.setAgeQ?1Q; } q种方式既可以检查异常类型,也可以验证异怸的消息?br /> 使用catch-exception?br /> 有个catch-exception库也可以实现对异常的试?br /> 首先引用该库?br /> pom.xml <dependency> <groupId>com.googlecode.catch-exception</groupId> <artifactId>catch-exception</artifactId> <version>1.2.0</version> <scope>test</scope> <!-- test scope to use it only in tests --> </dependency> 然后q样书写试?br /> @Test public void shouldGetExceptionWhenAgeLessThan0Q) { Person person = new PersonQ)Q?br /> catchExceptionQpersonQ。setAgeQ?1Q; assertThatQcaughtExceptionQ)QinstanceOfQIllegalArgumentException.classQ)Q?br /> assertThatQcaughtExceptionQ)。getMessageQ)Q?containsStringQ?age is invalid"Q)Q?br /> } q样的好处是可以_և的验证异常是被测Ҏ抛出来的Q而不是其它方法抛出来的?br /> catch-exception库还提供了多UAPI来进行测?strong>雅思答?/font> www.tygj123.com 先加载fest-assertion库?br /> <dependency> <groupId>org.easytesting</groupId> <artifactId>fest-assert-core</artifactId> <version>2.0M10</version> </dependency> 然后可以书写BDD风格的测试?br /> @Test public void shouldGetExceptionWhenAgeLessThan0Q) { // given Person person = new PersonQ)Q?br /> // when whenQpersonQ。setAgeQ?1Q; // then thenQcaughtExceptionQ)Q?br /> .isInstanceOfQIllegalArgumentException.classQ?br /> .hasMessageQ?age is invalid"Q?br /> .hasNoCauseQ)Q?br /> } 如果喜欢Hamcrest风格的验证风格的话,catch-exception也提供了相应的Matcher API. @Test public void shouldGetExceptionWhenAgeLessThan0Q) { // given Person person = new PersonQ)Q?br /> // when whenQpersonQ。setAgeQ?1Q; // then assertThatQcaughtExceptionQ)Q?allOfQ?br /> instanceOfQIllegalArgumentException.classQ?br /> , hasMessageQ?age is invalid"Q?br /> ,hasNoCauseQ)Q)Q?br /> } W一U最土鳖Q第二种最z,W四U最靠谱?/p> ]]> 反射破坏单例的私有构造函C?/title> http://www.tkk7.com/haosola/archive/2014/04/04/411928.html好不Ҏ 好不Ҏ Fri, 04 Apr 2014 01:29:00 GMT http://www.tkk7.com/haosola/archive/2014/04/04/411928.html http://www.tkk7.com/haosola/comments/411928.html http://www.tkk7.com/haosola/archive/2014/04/04/411928.html#Feedback 0 http://www.tkk7.com/haosola/comments/commentRss/411928.html http://www.tkk7.com/haosola/services/trackbacks/411928.html Java的反破坏单例的U有构造函C护,最典型的就是Spring的Bean注入Q我们可以通过攚w私有构造函数来防止?br /> 在Singleton中,我们只对外提供工厂方法(获取单例Q,而私有化构造函敎ͼ来防止外面多余的创徏?br /> 对于一般的外部调用来说Q私有构造函数已l很安全了?br /> public class Singleton { private SingletonQ){} private static volatile Singleton instance = null; public static SingletongetInstanceQ) throws Exception { if Qinstance ==nullQ?{ //Zz度Q暂不考虑U程安全 instance =new SingletonQ)Q?br /> } returninstance; } } Class singletonClass = Class.forNameQ?com.jscai.spring.demo.Singleton"Q; Constructor[] cts =singletonClass.getConstructorsQ)Q?br /> System.out.printlnQcts.lengthQ?www.yztrans.com 一般的外部调用Q编译器会校验,直接提示~译错误。而正常的反射也是找不到私有构造函数的Q所以上面的输出?. 但是一些特权用户可以通过反射来访问私有构造函敎ͼq且实例化: Constructor[] cts = singletonClass.getDeclaredConstructorsQ)Q?br /> System.out.printlnQcts.lengthQ; cts[0].setAccessibleQtrueQ; Singletonsingleton = QSingletonQ?cts[0].newInstanceQ)Q?br /> 上述代码首先通过反射的getDeclaredConstructorsQ)来获取所有构造函敎ͼpublic,protected,default * QpackageQ?access, andprivate constructorsQ,当然q个函数会校验调用者的权限?br /> 此时默认q是不能调用U有构造函数的Q还需要把讉K权限打开setAccessibleQtrueQ,可以访问私有构造函CQ这L坏了单例的私有构造函C护?br /> 如果要防御这L反射侵入Q可以修Ҏ造函敎ͼ加上W二ơ实例化的检查。(上面的getInstanceQ)l过多线E(DoubleCheckQ处理后Q就不会出现U程冲突来触发这个异常) private static int cntInstance = 0; private SingletonQ)throws Exception { if Q?+cntInstance > 1 Q?{ throw new ExceptionQ?Can'tcreate another instance."Q; } } 另外Q在Spring的Bean注入中,即你私有化构造函敎ͼ默认他还是会去调用你的私有构造函数去实例化?【通过BeanFactory来装配Bean,和上面的逻辑如出一辙?br /> 所以,如果我们想保证实例的单一性,p在定?lt;bean>时加上factory-method=""的属性,q且在私有构造函Cd防M机制。单例的getInstanceQ)可能会添加一些逻辑Q而Spring的默认调用构造函数去创徏Q就不能保证q䆾逻辑的准性,所以会带来隐患?br /> 我们可以通过scope="prototype"来测试单例是否被多次创徏Q?br /> <beanid="test"class="com.jscai.spring.demo.Singleton"scope="prototype"></bean> BeanFactory bf = new ClassPathXmlApplicationContextQ?demoAppTestContext.xml"Q; Singleton test1 = QSingletonQ?bf.getBeanQ?singleton"Q; Singleton test2 = QSingletonQ?bf.getBeanQ?singleton"Q; 发现防M机制生效Q抛?Can't create another instance."的异常,证明Spring能正常调用私有的构造函数来创徏Bean,q且创徏了多ơ?br /> q时候我们要使用factory-method来指定工厂方法,才能辑ֈ我们惌的效?www.tygj123.com <beanid="test"class="com.jscai.spring.demo.Singleton"scope="prototype"factory-method="getInstance"></bean> ]]> java写入文g的几U方法小l?/title> http://www.tkk7.com/haosola/archive/2014/03/23/411370.html好不Ҏ 好不Ҏ Sun, 23 Mar 2014 01:54:00 GMT http://www.tkk7.com/haosola/archive/2014/03/23/411370.html http://www.tkk7.com/haosola/comments/411370.html http://www.tkk7.com/haosola/archive/2014/03/23/411370.html#Feedback 0 http://www.tkk7.com/haosola/comments/commentRss/411370.html http://www.tkk7.com/haosola/services/trackbacks/411370.html java写入文g的几U方法小l?br /> 一QFileWritter写入文g FileWritter, 字符写入字W到文g。默认情况下Q它会用新的内容取代所有现有的内容Q然而,当指定一个true Q布)g为FileWritter构造函数的W二个参敎ͼ它会保留现有的内容,q追加新内容在文件的末尾 www.jx-jf.com 1. 替换所有现有的内容与新的内宏V?br /> new FileWriterQfileQ;2. 保留现有的内容和附加在该文g的末新内宏V?br /> 代码如下 new FileWriterQfile,trueQ; q加文gCZ 一个文本文Ӟ命名?javaio-appendfile.txt",q包含以下内宏V?br /> ABC Helloq加新内?new FileWriterQfile,trueQ?br /> 代码如下 package com.yiibai.file; import java.io.File; import java.io.FileWriter; import java.io.BufferedWriter; import java.io.IOException; public class AppendToFileExample { public static void mainQ?String[] args Q?br /> { try{ String data = " This content will append to the end of the file"; File file =new FileQ?javaio-appendfile.txt"Q; //if file doesnt exists, then create it ifQ!file.existsQ)Q{ file.createNewFileQ)Q?br /> } //true = append file FileWriter fileWritter = new FileWriterQfile.getNameQ)QtrueQ; BufferedWriter bufferWritter = new BufferedWriterQfileWritterQ; bufferWritter.writeQdataQ; bufferWritter.closeQ)Q?br /> System.out.printlnQ?Done"Q; }catchQIOException eQ{ e.printStackTraceQ)Q?br /> } } } l果 现在Q文本文?javaio-appendfile.txt"内容更新如下Q?br /> ABC Hello This content will append to the end of the file 二,BufferedWriter写入文g ~冲字符QBufferedWriter Q是一个字W流cL处理字符数据。不同于字节(数据转换成字节)Q你可以直接写字W串Q数l或字符数据保存到文件?br /> 代码如下 package com.yiibai.iofile; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; public class WriteToFileExample { public static void mainQString[] argsQ?{ try { String content = "This is the content to write into file"; File file = new FileQ?/users/mkyong/filename.txt"Q; // if file doesnt exists, then create it if Q!file.existsQ)Q?{ file.createNewFileQ)Q?br /> } FileWriter fw = new FileWriterQfile.getAbsoluteFileQ)Q; BufferedWriter bw = new BufferedWriterQfwQ; bw.writeQcontentQ; bw.closeQ)Q?br /> System.out.printlnQ?Done"Q; } catch QIOException eQ?{ e.printStackTraceQ)Q?br /> } } } 三,FileOutputStream写入文g www.jx-jf.com 文g输出是一U用于处理原始二q制数据的字节流cRؓ了将数据写入到文件中Q必d数据转换为字节,q保存到文g。请参阅下面的完整的例子?br /> 代码如下 package com.yiibai.io; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; public class WriteFileExample { public static void mainQString[] argsQ?{ FileOutputStream fop = null; File file; String content = "This is the text content"; try { file = new FileQ?c:/newfile.txt"Q; fop = new FileOutputStreamQfileQ; // if file doesnt exists, then create it if Q!file.existsQ)Q?{ file.createNewFileQ)Q?br /> } // get the content in bytes byte[] contentInBytes = content.getBytesQ)Q?br /> fop.writeQcontentInBytesQ; fop.flushQ)Q?br /> fop.closeQ)Q?br /> System.out.printlnQ?Done"Q; } catch QIOException eQ?{ e.printStackTraceQ)Q?br /> } finally { try { if Qfop != nullQ?{ fop.closeQ)Q?br /> } } catch QIOException eQ?{ e.printStackTraceQ)Q?br /> } } } } 更新的JDK7例如Qwww.111cn.net使用新的"试资源关闭"的方法来L处理文g?br /> package com.yiibai.io; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; public class WriteFileExample { public static void mainQString[] argsQ?{ File file = new FileQ?c:/newfile.txt"Q; String content = "This is the text content"; try QFileOutputStream fop = new FileOutputStreamQfileQ) { // if file doesn't exists, then create it if Q!file.existsQ)Q?{ file.createNewFileQ)Q?br /> } // get the content in bytes byte[] contentInBytes = content.getBytesQ)Q?br /> fop.writeQcontentInBytesQ; fop.flushQ)Q?br /> fop.closeQ)Q?br /> System.out.printlnQ?Done"Q; } catch QIOException eQ?{ e.printStackTraceQ)Q?br /> } } } ]]> java中接口之间的l承 http://www.tkk7.com/haosola/archive/2014/03/23/411369.html好不Ҏ 好不Ҏ Sun, 23 Mar 2014 01:49:00 GMT http://www.tkk7.com/haosola/archive/2014/03/23/411369.html http://www.tkk7.com/haosola/comments/411369.html http://www.tkk7.com/haosola/archive/2014/03/23/411369.html#Feedback 0 http://www.tkk7.com/haosola/comments/commentRss/411369.html http://www.tkk7.com/haosola/services/trackbacks/411369.html 最q在M些源码的时候突然发C一个很奇的东西,它的原始形态是q样的: 在这行代码中QBlockingDeque、BlockingQueue和Deque是三个接口。刚发现q个问题Ӟ我是十分吃惊的,因ؓ即在《Thinking in Java》中也没有提到接口之间的l承。所以我立即把这个疑问提交到了stackoverflow上面?br /> 正如在stackoverflow上面所讨论的一P一个类只能extends一个父c,但可以implements多个接口。java通过使用接口的概忉|取代C++中多l承。与此同Ӟ一个接口则可以同时extends多个接口Q却不能implementsM接口。因而,Java中的接口是支持多l承的?br /> 然后我又做了个实验,来验证如果多个父子接口中有多个相同的Ҏ声明Q然后在实现q个最l的接口的时候,相同的方法声明在实现的时候会不会有冲H呢Q?br /> 首先写了个接口:TestInterfaceA.java: 1 package com.peter.java.dsa.interfaces; 2 3 public interface TestInterfaceA { 4 String pri_key = "guess what the private key is"; 5 6 int addQint x, int yQ; 7 8 String encrytQbyte[] resultQ; 9 10 int getQ)Q?br /> 11 } 注意Q里面声明了三个Ҏ和一个变量; 然后再与了一个接口:TestInterfaceB.java: 1 package com.peter.java.dsa.interfaces; 2 3 public interface TestInterfaceB { 4 String pub_key = "guess what the public key is"; 5 6 int minusQint x, int yQ; 7 8 byte[] decrytQString srcQ; 9 10 int getQ)Q?br /> 11 } 里面也声明了三个Ҏ和一个变量; 然后再定义了一个接口InterfaceMultiInheritance.java同时l承了接口TestInterfaceA.java和接口TestInterfaceB.java: 1 package com.peter.java.dsa.interfaces; 2 3 public interface InterfaceMultiInheritance extends TestInterfaceA, 4 TestInterfaceB { 5 int num = 1024; 6 7 double divideQint x, int yQ; 8 9 int getQ)Q?br /> 10 } 里面声明了两个方法和一个变量; 注意Q在q三个接口中Q有一个共同的Ҏ声明QgetQ)。这个都是要讨论的主题?br /> 最后在一个类InterfaceImplementTest.java中实C接口InterfaceMultiInheritance.java,源码如下Q?br /> 1 package com.peter.java.dsa.common; 2 3 import com.peter.java.dsa.interfaces.InterfaceMultiInheritance; 4 import com.sun.org.apache.xml.internal.security.exceptions.Base64DecodingException; 5 import com.sun.org.apache.xml.internal.security.utils.Base64; 6 7 public class InterfaceImplementTest implements InterfaceMultiInheritance { 8 9 @Override 10 public int addQint x, int yQ?{ 11 // TODO Auto-generated method stub 12 return x + y; 13 } 14 15 @Override 16 public String encrytQbyte[] resultQ?{ 17 // TODO Auto-generated method stub 18 return Base64.encodeQresultQ; 19 } 20 21 @Override 22 public int minusQint x, int yQ?{ 23 // TODO Auto-generated method stub 24 return x - y; 25 } 26 27 @Override 28 public byte[] decrytQString srcQ?{ 29 // TODO Auto-generated method stub 30 try { 31 return Base64.decodeQsrcQ; 32 } catch QBase64DecodingException eQ?{ 33 // TODO Auto-generated catch block 34 e.printStackTraceQ)Q?br /> 35 } 36 return null; 37 } 38 39 @Override 40 public double divideQint x, int yQ?{ 41 // TODO Auto-generated method stub 42 return x/y; 43 } 44 45 @Override 46 public int getQ) { 47 // TODO Auto-generated method stub 48 return num; 49 } 50 51 public void printQ) { 52 System.out.printlnQ?The public key is: "+pub_key+"\nThe private key is: "+pri_keyQ; 53 } 54 55 } 在这个类中,只有一个getҎ实现了,同时也没有ؓ有多个get要实现而冲H。同Ӟ如果删除了接口InterfaceMultiInheritance.java中的getҎQ也只有一个getҎ得到了实现ƈ且没有ؓ多个get要实现而出C么冲H?br /> 所以,我们可以得到一个结论,当编译器在实现接口的时候会依然查接口InterfaceMultiInheritance.java、TestInterfaceA.java和TestInterfaceB.java中的Ҏ声明Q如果后两者有与前者相冲突的方法声明,~译器将只要求类实现前者的声明Q而后两者中相同的方法声明将自动被忽略。而当只有后两者中有相同的Ҏ声明Ӟ~译器将实现其中的一个即可。就好像是编译器中有一个专门存储方法声明的Set一P在有l承关系的接口中Q只保存一ơ相同的Ҏ声明 www.jx-jf.com ]]> Java中的反射的应?/title> http://www.tkk7.com/haosola/archive/2014/03/18/411179.html好不Ҏ 好不Ҏ Tue, 18 Mar 2014 09:21:00 GMT http://www.tkk7.com/haosola/archive/2014/03/18/411179.html http://www.tkk7.com/haosola/comments/411179.html http://www.tkk7.com/haosola/archive/2014/03/18/411179.html#Feedback 0 http://www.tkk7.com/haosola/comments/commentRss/411179.html http://www.tkk7.com/haosola/services/trackbacks/411179.html 在正常情况下Q需要先有一个类的完整\径引入之后才可以按照固定的格式生实例话对象Q但是在Java中也允许通过一个实例话对象扑ֈ一个类的完整信息。那么这是Classcȝ功能?br /> 实际上类是Java反射的源_实际上所谓反从E序的运行结果来看也很好理解Q即可以通过对象的反求出类的名U?br /> 实例化Classc,获得字节码文件的Ҏ有三U: W一U:通过forNameQ)ҎQ第二种Q类。classW三U:对象。getClassQ) package toto.learn; class X1{} publicclass GetClassDemo02 { publicstaticvoid mainQString[] argsQ?{ Class c1=null;//指定泛型 Class c2=null;//指定泛型 Class c3=null;//指定泛型 try{ c1=Class.forNameQ?toto.learn.X"Q;//最常用的Ş式,q种方式字节码文g加蝲到内存中?br /> }catchQClassNotFoundException eQ{ e.printStackTraceQ)Q?br /> } c2 = new X1Q)。getClassQ)Q?/通过ObjectcM的方法实?br /> c3 = X1.class;//通过cclass实例?br /> System.out.printlnQ?cdUͼ"+c1.getNameQ)Q;//得到cȝ名称 System.out.printlnQ?cdUͼ"+c2.getNameQ)Q;//得到cȝ名称 System.out.printlnQ?cdUͼ"+c3.getNameQ)Q;//得到cȝ名称 } } 通过以上Ҏ获得cdU的方式得到的是包名+cd 如果要想通过ClasscLw实例化其他cȝ对象Q则可以使用newInstanceQ)ҎQ但是必要保证被实例化的类中必d在一个无参够造方法?br /> 被实例化对象的类中必d在无参构造方法,如果不存在的话,则肯定是无法实例化的?br /> 1?通过ClasscM的getConstructorsQ)取得本类中的全部构造方?br /> 2?向构造方法中传递一个对象数l进去,里面包含了构造方法中所需的各个参?br /> 3?之后通过Constructor实例化对象?br /> package org.lxh.demo15.instancedemo; import java.lang.reflect.Constructor; publicclass InstanceDemo03 { publicstaticvoid mainQString[] argsQ?{ Class c = null; try { c = Class.forNameQ?org.lxh.demo15.instancedemo.Person"Q; // 声明Class对象 } catch QClassNotFoundException eQ?{ e.printStackTraceQ)Q?br /> } Person per = null; // 声明Person对象 Constructor cons[] = null; // 声明一个表C构造方法的数组 cons = c.getConstructorsQ)Q?// 通过反射Q取得全部构?br /> try {// 向构造方法中传递参敎ͼ此方法用可变参数接Ӟq实例化对象 per = QPersonQ?cons[0].newInstanceQ?李兴?, 30Q; } catch QException eQ?{ // 因ؓ只有一个构造,所以数l下标ؓ0 e.printStackTraceQ)Q?br /> } System.out.printlnQperQ; // 输出对象 } } per = QPersonQcons[0].newInstanceQ?李兴?, 30Q; //此处是调用ƈ使用构造方法的部分?br /> 在声明对象数l的时候,必须考虑到构造方法中参数的类型顺序,所以第一个参数的cd为Stirng,W二个参数的cdWieIntegerQ在使用是可以自动拆) Constructorcons[]=null;//实例化构造方法的数组 Cons =c.getConstructorsQ)Q?/取得全部构?br /> //向构造方法中传递参敎ͼ此方使用可变参数接收Qƈ实例化对?br /> Per = QPersonQcons[0].newInstanceQ?李兴?,30Q; 讄构造方法的参数内容 publicPersonQString name,int ageQ{//通过构造设|属性内?br /> } 反射的应?br /> 可以使用反射取得实现的全部接?br /> 可以使用反射取得一个类所l承的父c?br /> 可以使用反射取得一个类中的全部构造方?br /> 可以使用反射取得一个类中的全部Ҏ 可以使用反射取得一个类中的全部属?br /> 在实际开发中发,以上的程序就是反应用最多的地方Q当然反机制所提供的功能远不如此,q可以通过反射得到一个类中的完整构造,那么q就要用到java.lang.reflect包中的一下几个类?br /> Constructor:表示cM的构造方?br /> Field:表示cM的属?br /> Method:表示cM的方?br /> q三个类都是AccessibleObjectcM的子cR?br /> 要想取得一个类中所实现的全部接口,则必M用ClasscM的getInterfacesQ)Ҏ。此Ҏ定义如下Q?br /> publicClass[] getInterfacesQ)Q?br /> 此方法返回一个Classcȝ对象数组Q之后就可以直接利用ClasscM的getNameQ)Ҏ输出卛_?br /> 通过反射取得实现的全部接?br /> package org.lxh.demo15; publicclass GetInterfaceDemo { publicstaticvoid mainQString[] argsQ?{ Class c1 =null;//声明Class对象 try{ c1 = Class.forNameQ?org.lxh.demo15.Person"Q;//实例化Class对象 }catchQClassNotFoundException eQ{ e.printStackTraceQ)Q?br /> } Class c[] = c1.getInterfacesQ)Q?/取得实现的全部接?br /> forQint i=0;i System.out.printlnQ?实现的接口名Uͼ"+c[i].getNameQ)Q;//输出接口名称 } } } 一个类中可以实现多个接口,但是只能l承一个父c,所以如果要惛_得一个类的父c,可以直接使用ClasscM的getSuperclassQ)Ҏ。此Ҏ定义如下Q?br /> PublicClass getSuperclassQ) 此方法返回的是Class实例Q和之前的得到接口一P可以通过getNameQ)Ҏ取得名称?br /> 取得构造方法的例子Q?br /> package org.lxh.demo15; import java.lang.reflect.Constructor;//导入反射操作?br /> publicclass GetConstructorDemo01 { publicstaticvoid mainQString[] argsQ?{ Class c1 = null;//声明Class对象 try{ c1 = Class.forNameQ?org.lxh.demo15.Person"Q; }catchQClassNotFoundException eQ{ e.printStackTraceQ)Q?br /> } Constructor con[]=c1.getConstructorsQ)Q?/得到全部构造方?br /> forQint i=0;i System.out.printlnQ?构造方法:"+con[i]Q;//直接打印输出 } } } q原修饰W?br /> 在整个Java中对于方法的修饰W用一定的数字表示出来的,而如果要xq个数字q原成用户可以看懂的关键字,则必M靠Modifiercd成,此类定义在java.lang.reflect包中。直接用Modifercȝ一下方法可修饰W: publicstatic String toStringQint modQ?br /> int mo = con[i].getModifiersQ)Q?br /> System.out.printQModifier.toStringQmoQ?""Q; //q原权限 getDeclaredMethodsQ)ҎQ此Ҏq回一个Methodcȝ对象数组Q而如果要惌一步取得方法具体信息,例如Q方法的参数Q抛出的异常声明{等Q则是必须依靠Methodc?br /> 再反操作中同样可以取得一个类中的全部属性,但是在取得属性的时候有以下两种不同的操作: 得到实现的接口或父类中的公共属性:public Field[] getFieldsQ) throwsSecurityException 得到本类中自己定义的的全部属性:public Field[] getDeclaredFieldsQ) throws SecurityException 如果要用反调用类中的Ҏ可以通过Methodcd成,操作步骤如下Q?br /> 1?通过ClasscȝgetMethodQStringname,Class…parameterTypesQ方法取得一个Method的对象,q设|此Ҏ操作时所需的参数类型?br /> 2?之后才可以用invokeq行调用Qƈ向方法中传递要讄的参?strong>托福{案 www.jamo123.com 在ProxycM的newProxyInstanceQ)Ҏ中,需要一个ClassLoadercȝ实例QClassLoader实际上对应的是类加蝲器,在Java中主要有以下三种cd载器Q?br /> BootstrapClassLoader:此加载器采用C++ ~写Q一般开发中是看不到的; ExtensionClassLoader:用来q行扩展cȝ加蝲Q一般对应的是jre\lib\ext目录中的c; AppClassLoader:加蝲classpath指定的类Q是最常用使用的一U加载器?br /> 通过forNameQ)加蝲cMơ时Q此时的cd加蝲了一?br /> 如果有以下代码: Object obj= new VipUserQ)Q?/q里VipUser是User的子c,它承了User ifQobj instanceof UserQ{ System.out.printlnQ?instanceof判断是一个user"Q; User user = QUserQobj; } 当用以上代码中的instanceof来判断时Q此时obj是一个User了,但实际上它不是。它只是User的一个子cR?br /> ȝQ用instanceof时主要用来判断是否实C后面的接口?br /> ifQobj.getClassQ)==User.classQ{ System.out.printlnQ?getClass判断Q是一个user"Q; User user = QUserQobj; } 而getClassQ)用于判断对象的准类型?br /> 在后面用到的c: package toto.learn1; publicclass User { private String name; private String password; private String gender; public UserQString name, String password, String genderQ?{ superQ)Q?br /> this.name = name; this.password = password; this.gender = gender; } public UserQ) { superQ)Q?br /> // TODO Auto-generatedconstructor stub } public UserQString name, String passwordQ?{ superQ)Q?br /> this.name = name; this.password = password; } public String getNameQ) { returnname; } publicvoid setNameQString nameQ?{ this.name = name; } public String getPasswordQ) { returnpassword; } publicvoid setPasswordQString passwordQ?{ this.password = password; } public String getGenderQ) { returngender; } publicvoid setGenderQString genderQ?{ this.gender = gender; } publicvoid runQString str, int numQ{ System.out.printlnQ?run"Q; } publicvoid runQString nameQ{ System.out.printlnQ?hello:"+nameQ; } } 以下是关于反的部分?br /> package toto.learn1; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; publicclass Demo2 { /** * 反射 * @throwsIllegalAccessException * @throwsInstantiationException * @throwsNoSuchMethodException * @throwsSecurityException */ publicstaticvoid mainQString[] argsQ?throws Exception { Class clazz = User.class; //构造方?br /> //获得构造方?br /> Constructor[] cons = clazz.getConstructorsQ)Q?br /> forQConstructor con : consQ{ //参数列表Q获得的U定是完整的参数cdQ包括这U类型坐在的包?br /> Class[] types = con.getParameterTypesQ)Q?br /> System.out.printlnQ?参数cd为:"Q; forQClass type:typesQ{ System.out.printlnQtype.getNameQ)+"…"Q; } System.out.printlnQ)Q?br /> } //获得指定的构造方?创徏对象 try { Object obj = clazz.newInstanceQ)Q?/默认调用无参的构造方?br /> System.out.printlnQobj.getClassQ)Q; } catch QInstantiationException eQ?{ e.printStackTraceQ)Q?br /> } catch QIllegalAccessException eQ?{ e.printStackTraceQ)Q?br /> } /**参数cd为: java.lang.String… java.lang.String… 参数cd为: java.lang.String… java.lang.String… java.lang.String… class toto.learn1.User*/ System.out.printlnQ?-------------------------"Q; //获得指定的构造方? 创徏对象 Object obj = clazz.newInstanceQ)Q?/默认调用无参的构造方?br /> Constructor constructor = clazz.getConstructorQString.class,String.classQ;//此处调用有两个参数的构造方?br /> //String.class是因为构造方法中有带有年个参数的构造方法的形参都是Stringcȝ?br /> User usr = QUserQconstructor.newInstanceQ?toto","查看"Q;//传递两个参数?br /> System.out.printlnQusr.getNameQ)+" "+usr.getPasswordQ)Q;//l果Qtoto 查看 //Ҏ //获得cL有的Ҏ Method [] methods = clazz.getMethodsQ)Q?br /> forQMethod method:methodsQ{ System.out.printlnQmethod.getNameQ)Q; } /**通过getMethodsQ)Ҏ获得的类中包含有父类的方法,q且拿到的是共有的方?br /> * run run getName setName getPassword setPassword getGender setGender wait wait wait hashCode getClass equals toString notify notifyAll * */ //如果惌得声明的所有方法,包括非public的,不包括承的Q可以用一下途径实现 System.out.printlnQ?-----------------------"Q; Method [] methods2 = clazz.getDeclaredMethodsQ)Q?br /> forQMethod method:methods2Q{ System.out.printlnQmethod.getNameQ)Q; } /**l果是: * run run getName setName getPassword setPassword getGender setGender*/ //获得指定的方法,调用Ҏ Method runMethod = clazz.getMethodQ?run", String.classQ; /**W一个表C调用那个Ҏ W二个参数是可变参数Q表C用的润方法的参数cd?/ //获得了方法后Q要执行Ӟ得给Z个对象,在这里要执行的对象是User,故作如下实例 User usr1 = new UserQ)Q?br /> runMethod.invokeQusr1, "toto"Q;//表示执行usr1对象中的runMethodҎQƈ且向Ҏ中传递了参数?br /> /** * q行l果Qhello:toto 此ؓUsercMrunQString nameQ;Ҏ输出的结果,其中name即ؓtoto*/ //属?strong>托福{案 www.lefeng123.com //获得对象的属性,先创Z个对?br /> Object object = new UserQ?toto","123","male"Q;//调用User中的构造方法: //׃获得对象的私有属性,得获得getҎQ故得先获得对象的字节码文gQ通过q个文g获得getҎ Class objectClazz = object.getClassQ)Q?br /> //获得getҎ Method runMethod2 = clazz.getMethodQ?getName"Q; //׃该方法没有参敎ͼ故不用在向里面传递参?br /> //执行此方法,输出参数 Object name = runMethod2.invokeQobjectQ; System.out.printlnQnameQ;//׃上面传递了name|故此处返回的l果gؓQtoto //获得所有属?br /> System.out.printlnQ?-------------------------------"Q; //Field[] fields =clazz.getFieldsQ)Q?/此方法拿到的是public的属性,׃UsercM没有共有的属?br /> Field[] fields = clazz.getDeclaredFieldsQ)Q?/拿到声明的属?br /> forQField fd : fieldsQ{ System.out.printlnQfd.getNameQ)+"属性类型: "+fd.getTypeQ)Q; } /** l果为: * name属性类型: class java.lang.String password属性类型: class java.lang.String gender属性类型: class java.lang.String*/ //为对象的password属性赋| User user2 = new UserQ)Q?br /> String fieldName = "password";//作ؓ变量来处理的Q可以传递Q意的属性名U?br /> //getpw是通过反射拿到的属性,其实是password Field getpw = user2.getClassQ)。getDeclaredFieldQfieldNameQ; //判断属性是否ؓU有Q?br /> int num = getpw.getModifiersQ)Q?/q回的是整型的倹{?br /> ifQnum == Modifier.PRIVATEQ{//获得的是 System.out.printlnQ?属性是U有?Q; //让java虚拟Z查访问权?br /> //getpw.setAccessibleQtrueQ; } //System.out.printlnQgetpwQ;//l果private java.lang.Stringtoto.learn1.User.password getpw.setQuser2, 234567Q;//前一个参数表C的是ؓ那个对象赋密码?br /> System.out.printlnQuser2.getPasswordQ)Q; } } 通过Fieldc访问对象属性时Q需要注意访问权限的问题Q若对象的属性被声明为私有,则无法访问,此时需要打开java语言查filed.setAccessibleQtrueQ; MethodcM表某个类中的一个成员方法通过invokeҎ可以调用Method表示的方法,此时同样需要传递对象给Method,若被调用的方法ؓ静态,则传入一个null?br /> 注意Qjdk1.4和jdk1.5的invokeҎ的区别: Jdk1.5:public Object invokeQObjectobj,Object… argsQ?br /> Jdk1.4:public Object invokeQObjectobj,Object[] argsQ?br /> 当传入一个数l时Qؓ了向后兼容,虚拟Z优先考虑考虑调用JDK1.4的方?/p> ]]> 使用UrlRewriteFilter对urlq行更替 http://www.tkk7.com/haosola/archive/2014/03/17/411146.html好不Ҏ 好不Ҏ Mon, 17 Mar 2014 13:06:00 GMT http://www.tkk7.com/haosola/archive/2014/03/17/411146.html http://www.tkk7.com/haosola/comments/411146.html http://www.tkk7.com/haosola/archive/2014/03/17/411146.html#Feedback 0 http://www.tkk7.com/haosola/comments/commentRss/411146.html http://www.tkk7.com/haosola/services/trackbacks/411146.html 一般来_使用struts之后url的访问实际上讉K的是action的地址Qؓ了不让该地址暴露l别人,可以采用UrlRewriteFilter来对urlq行重写?br />首先Q在web.xml里面配置Q?br /><filter> <filter-name>UrlRewriteFilter</filter-name> <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class> <init-param> <param-name>confReloadCheckInterval</param-name> <param-value>60</param-value> </init-param> <init-param> <param-name>confPath</param-name> <param-value>/WEB-INF/urlrewrite.xml</param-value> </init-param> </filter> <filter-mapping> <filter-name>UrlRewriteFilter</filter-name> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <url-pattern>/*</url-pattern> </filter-mapping> 注意Q要在struts的mapping里面加上Q要不然会出错的Q这个花了我半天才搞定。还有一点:UrlRewriteFilter要放在struts Filter之前。web.xml里面qo器需要讲I序,一般是q样子的序Q字W编码过滤器Qhibernate open session in view qo器,Urlrewriteqo器,strutsqo器?br /><dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> 然后在WEB-INF里面新徏urlrewrite.xml文gQ该文g为UrlRewriteFilter的配|文Ӟ通过在里面定义rule规则对URLq行更替?br /> 下面是urlrewrite.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.2//EN" "http://tuckey.org/res/dtds/urlrewrite3.2.dtd"> <urlrewrite> <rule> <!-- 地址栏显C的地址 --> <from>/anything</from> <!-- 真实的请求地址 --> <to>/url/test.action</to> </rule> </urlrewrite> 以上只是单的实现Q具体的替换需要用到正则表辑ּ?br />如下例: <from>/content/Q[0-9]+Q?list</from> <to type="forward">/IssuedContentAction.do?dispatch=vContentListBySubid&scope=vmcontent&columninfoid=$1</to> 需要注意的地方是:用括hh的正则表辑ּ为变量,如to标签里面?1表示的是上面from里面的第一个括号内宏Vurl里面的参数间隔符 '&'应该写ؓ'&'. 值得注意的是<outbound-rule>标签Q可以用该标签替换面里面的url托福{案 www.yztrans.com 单的正则表达式: . 匚w除换行符以外的Q意字W?br />\w 匚w字母或数字或下划U或汉字 \s 匚wL的空白符 \d 匚w数字 \b 匚w单词的开始或l束 ^ 匚w字符串的开?br />$ 匚w字符串的l束 ]]>
վ֩ģ壺
Ļ |
ۺ |
һƵ |
˳Ƶۿ |
һƵ |
ҹþþƷ
|
av˾Ʒ |
Ʒަv
|
þþþƷþþþþþ |
һƵ |
avһ |
þþþŷղAV
|
һƬ |
ĻӰȫѰ
|
һĻߵӰ |
һҳۺͼƬ |
91ɫƷ |
ްv2017 |
Ļձ |
þþƷžƷ |
Ұ¾þø |
69Ƶѹۿ |
һ |
ɬɬɫۺ |
վ߹ۿ |
ŷƷAV |
Ұ¾þø |
ӰҹƵ |
ĻֻѿӰ
|
ŮAëƬƵ |
ۺŷ㻨 |
ɫ |
Ļ벻Ӱ |
һƬaƵѹۿ |
vaѾƷۿƷ |
þùƷѹۿ |
˳߲VA |
㽶Ƶ߲ |
Ů侫 |
|
Ʒۺɫ |