??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲AV无码一区二区三区性色 ,久久久久亚洲爆乳少妇无,亚洲国产成人精品无码区在线秒播 http://www.tkk7.com/haosola/archive/2014/11/16/420127.html好不Ҏ(gu)好不Ҏ(gu)Sun, 16 Nov 2014 00:47:00 GMThttp://www.tkk7.com/haosola/archive/2014/11/16/420127.htmlhttp://www.tkk7.com/haosola/comments/420127.htmlhttp://www.tkk7.com/haosola/archive/2014/11/16/420127.html#Feedback1http://www.tkk7.com/haosola/comments/commentRss/420127.htmlhttp://www.tkk7.com/haosola/services/trackbacks/420127.html  JAVA中在q用数组q行排序功能Ӟ一般有四种Ҏ(gu)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中的四种排序Ҏ(gu)。不同的Ҏ(gu)效率不一P下面是不同的法的比较和数据交换时的大O表示?br />  冒排序Q比较OQN2Q?数据交换OQN2Q?br />  选择排序Q比较OQN2Q?数据交换OQNQ?br />  插入排序Q比较OQN2Q?复制数据OQNQ?br />  在实际应用中Q我们要量选择效率高的法托福{案 托福{案



好不Ҏ(gu) 2014-11-16 08:47 发表评论
]]>
java的抽象类和抽象方?/title><link>http://www.tkk7.com/haosola/archive/2014/11/16/420126.html</link><dc:creator>好不Ҏ(gu)</dc:creator><author>好不Ҏ(gu)</author><pubDate>Sun, 16 Nov 2014 00:39:00 GMT</pubDate><guid>http://www.tkk7.com/haosola/archive/2014/11/16/420126.html</guid><wfw:comment>http://www.tkk7.com/haosola/comments/420126.html</wfw:comment><comments>http://www.tkk7.com/haosola/archive/2014/11/16/420126.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.tkk7.com/haosola/comments/commentRss/420126.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/haosola/services/trackbacks/420126.html</trackback:ping><description><![CDATA[<div>    抽象cd是不能用newҎ(gu)q行实例化的c,x有具体实例对象的cR抽象类有点cM“模板”的作用,目的是根据其格式来创建和修改新的cR对象不能由抽象cȝ接创建,只可以通过抽象cL生出新的子类Q再由其子类来创建对象。当一个类被声明ؓ抽象cLQ要在这个类前面加上修饰Wabstract.<br /><br />  在抽象类中的成员Ҏ(gu)可以包括一般方法和抽象Ҏ(gu)。抽象方法就是以abstract修饰的方法,q种Ҏ(gu)只声明返回的数据cd、方法名U和所需的参敎ͼ没有Ҏ(gu)体,也就是说抽象Ҏ(gu)只需要声明而不需要实现。当一个方法ؓ抽象Ҏ(gu)Ӟ意味着q个Ҏ(gu)必须被子cȝҎ(gu)所重写Q否则其子类的该Ҏ(gu)仍然是abstract的,而这个子cM必须是抽象的Q即声明为abstract.<br /><br />  抽象cM不一定包含抽象方法,但是包含抽象Ҏ(gu)的类一定要被声明ؓ抽象cR抽象类本n不具备实际的功能Q只能用于派生其子类。抽象类中可以包含构造方法,但是构造方法不能被声明为抽象?br /><br />  调用抽象cM的方法(抽象Ҏ(gu)和非抽象Ҏ(gu)Q,如果Ҏ(gu)是static的,直接 抽象cR方?可以了Q如果是非static的则必须需要一个承的非抽象类Q然后用q个非抽象类的实例来调用Ҏ(gu)?br /><br />  抽象cd以实现接口,接口中的Ҏ(gu) 在抽象类中可以不实现Q当有子cȝ?抽象cLQƈ且子cM是抽象类Ӟ子类需要将抽象cM?抽象Ҏ(gu)和接口中的方法都实现<strong><em><a ><font color="#e8e8e8" size="2">托福{案</font></a></em></strong><br /><br />  抽象cM能用final来修饎ͼ即一个类不能既是最l类又是抽象c?strong><em><a ><font color="#e8e8e8" size="2">托福{案</font></a></em></strong><br /><br />  ȝQ?abstract不能与private、static、final、nativeq列修饰同一个方法?/div><img src ="http://www.tkk7.com/haosola/aggbug/420126.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/haosola/" target="_blank">好不Ҏ(gu)</a> 2014-11-16 08:39 <a href="http://www.tkk7.com/haosola/archive/2014/11/16/420126.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java实现的网l文件传?/title><link>http://www.tkk7.com/haosola/archive/2014/09/20/418119.html</link><dc:creator>好不Ҏ(gu)</dc:creator><author>好不Ҏ(gu)</author><pubDate>Sat, 20 Sep 2014 07:01:00 GMT</pubDate><guid>http://www.tkk7.com/haosola/archive/2014/09/20/418119.html</guid><wfw:comment>http://www.tkk7.com/haosola/comments/418119.html</wfw:comment><comments>http://www.tkk7.com/haosola/archive/2014/09/20/418119.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/haosola/comments/commentRss/418119.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/haosola/services/trackbacks/418119.html</trackback:ping><description><![CDATA[<p>  FileUpload包下放了三个c:<br />  OpenAndSave.java<br />  TCPClient .java<br />  TCPServer.java<br />  1、OpenAndSave.java<br />  package FileUpload;<br />  import java.awt.*;<br />  import javax.swing.*;<br />  import java.util.*;<br />  import java.io.*;<br />  public class OpenAndSave extends JFrame {<br />  // 选择打开文g<br />  public String getFileQ) {<br />  String fileName="";<br />  FileDialog fd = new FileDialogQthis, "请选择要传lzpc的文?, FileDialog.LOADQ;<br />  fd.setDirectoryQ?C:\\"Q;<br />  fd.setVisibleQtrueQ;<br />  // 获取此文件对话框选定的文?br />  if Qfd.getFileQ)Q? nullQ?{<br />  fileName=fd.getDirectoryQ) + fd.getFileQ)Q?br />  System.out.printlnQ?已选择打开 " +fileName Q;<br />  }<br />  return fileName;<br />  }<br />  // 保存文g<br />  public OutputStream saveFileQString fileNameQ?{<br />  OutputStream os=null;<br />  try {<br />  FileDialog fd = new FileDialogQthis, "保存文g", FileDialog.SAVEQ;<br />  // 对话框打开时显C默认的目录<br />  fd.setDirectoryQ?C:\\"Q;<br />  fd.setFileQfileNameQ;<br />  fd.setVisibleQtrueQ;<br />  if Qfd.getFileQ) != nullQ?{<br />  File myFile = new FileQfd.getDirectoryQ)Q?fd.getFileQ)Q;<br />  os = new FileOutputStreamQmyFileQ;<br />  }<br />  } catch QIOException ioeQ?{<br />  JOptionPane.showMessageDialogQthis, "文g保存发生错误Q已停止"Q;<br />  }<br />  return os;<br />  }<br />  }<br />  2、TCPServer.java<br />  /*<br />  * Author:zpc<br />  * Time:2014-5-1<br />  */<br />  package FileUpload;<br />  import java.io.*;<br />  import java.net.*;<br />  import java.util.Random;<br />  import javax.swing.*;<br />  //每接受一个客L(fng)h单开一个线E处?br />  class UploadProcess implements Runnable {<br />  private Socket s;<br />  public UploadProcessQSocket sQ?{<br />  this.s = s;<br />  }<br />  public void runQ) {<br />  OutputStream fos = null;<br />  try {<br />  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,<br />  "(zhn)想接受文g" + fileName + "吗?", "消息",<br />  JOptionPane.YES_NO_OPTION, 0, null, null, nullQ) == 0Q?{<br />  System.out.printlnQ?我已选择接受文gQ?Q;<br />  String message1="服务器已接收Q?;<br />  fos1.writeUTFQmessage1Q;<br />  fos = new OpenAndSaveQ)。saveFileQfileNameQ;<br />  int len = 0;<br />  byte[] bytes = new byte[1024];<br />  if Qfis != nullQ?{<br />  while Q(len = fis.readQbytesQ) != -1Q?{<br />  fos.writeQbytes, 0, lenQ;<br />  }<br />  }<br />  JOptionPane.showMessageDialogQnull, "文g保存成功Q?Q;<br />  if Qfis != nullQ?br />  fis.closeQ)Q?br />  if Qfos != nullQ?br />  fos.closeQ)Q?br />  }<br />  else {<br />  System.out.printlnQ?我选择了拒l接受!"Q;<br />  String message2="提示Q对方已拒绝接受Q?;<br />  fos1.writeUTFQmessage2Q;<br />  }<br />  } catch QException eQ?{<br />  System.out.printlnQ?接受文gp|Q?Q;<br />  }<br />  }<br />  }<br />  public class TCPServer {<br />  public static void mainQString[] argsQ?throws IOException {<br />  // 建立服务器端的socket对象ServerSocket<br />  ServerSocket ss = new ServerSocketQ?0001Q;<br />  while QtrueQ?{<br />  Socket s = ss.acceptQ)Q?br />  // 每个客户端的h创徏一个Socket对象Q单开一个线E处?br />  new ThreadQnew UploadProcessQsQ)。startQ)Q?br />  }<br />  }<br />  }<br />  3、TCPClient .java<br />  /*<br />  * Author:zpc<br />  * Function:上传文gl用户zpc<br />  * Time:2014-5-1<br />  */<br />  package FileUpload;<br />  import java.io.*;<br />  import java.net.*;<br />  public class TCPClient {<br />  public static void mainQString[] argsQ?throws UnknownHostException{<br />  // q行文g的读取。数据源<strong><em><a ><font color="#f3f3f3">SAT{案</font></a></em></strong><br />  OpenAndSave open = new OpenAndSaveQ)Q?br />  String fileName = open.getFileQ)Q?br />  File myFile = new FileQfileNameQ;<br />  InputStream in = null;<br />  try {<br />  in = new FileInputStreamQmyFileQ;<br />  } catch QFileNotFoundException e1Q?{<br />  System.out.printlnQ?未选中文gQ?Q;<br />  }<br />  // 数据目的地是另一C机,通过Socket获取I/O?br />  if Qin != nullQ?{<br />  Socket s = null;<br />  try {<br />  s = new SocketQ?127.0.0.1", 10001Q;//q里写好目标机器IP地址和Q意一个开攄未被其它E序占用的端口号<br />  DataOutputStream os = new DataOutputStreamQs.getOutputStreamQ)Q;<strong><em><a ><font color="#f3f3f3">托福{案</font></a></em></strong><br />  os.writeUTFQfileNameQ;<br />  byte[] b = new byte[1024];<br />  int len = 0;<br />  while Q(len = in.readQbQ) != -1Q?{<br />  os.writeQb, 0, lenQ;<br />  }<br />  //System.out.printlnQ?message"Q;<br />  DataInputStream fis = new DataInputStreamQs.getInputStreamQ)Q;<br />  String message = fis.readUTFQ)Q?br />  System.out.printlnQmessageQ;<br />  if Qos != nullQ?br />  os.closeQ)Q?br />  if Qin != nullQ?br />  in.closeQ)Q?br />  } catch QException eQ?{<br />  System.out.printlnQ?貌似zpc不在U,E后再传Q!"Q;<br />  }<br />  } else {<br />  System.out.printlnQ?文gdp|Qin = nullQ!"Q;<br />  }<br />  }</p><img src ="http://www.tkk7.com/haosola/aggbug/418119.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/haosola/" target="_blank">好不Ҏ(gu)</a> 2014-09-20 15:01 <a href="http://www.tkk7.com/haosola/archive/2014/09/20/418119.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA中运用数l的四种排序Ҏ(gu)http://www.tkk7.com/haosola/archive/2014/09/20/418118.html好不Ҏ(gu)好不Ҏ(gu)Sat, 20 Sep 2014 06:57:00 GMThttp://www.tkk7.com/haosola/archive/2014/09/20/418118.htmlhttp://www.tkk7.com/haosola/comments/418118.htmlhttp://www.tkk7.com/haosola/archive/2014/09/20/418118.html#Feedback0http://www.tkk7.com/haosola/comments/commentRss/418118.htmlhttp://www.tkk7.com/haosola/services/trackbacks/418118.html  JAVA中在q用数组q行排序功能Ӟ一般有四种Ҏ(gu)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中的四种排序Ҏ(gu)。不同的Ҏ(gu)效率不一P下面是不同的法的比较和数据交换时的大O表示?br />  冒排序Q比较OQN2Q?数据交换OQN2Q?br />  选择排序Q比较OQN2Q?数据交换OQNQ?br />  插入排序Q比较OQN2Q?复制数据OQNQ?br />  在实际应用中Q我们要量选择效率高的法?/p>

好不Ҏ(gu) 2014-09-20 14:57 发表评论
]]>
用Guava辅助Throwable异常处理http://www.tkk7.com/haosola/archive/2014/09/20/418117.html好不Ҏ(gu)好不Ҏ(gu)Sat, 20 Sep 2014 06:52:00 GMThttp://www.tkk7.com/haosola/archive/2014/09/20/418117.htmlhttp://www.tkk7.com/haosola/comments/418117.htmlhttp://www.tkk7.com/haosola/archive/2014/09/20/418117.html#Feedback0http://www.tkk7.com/haosola/comments/commentRss/418117.htmlhttp://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Ҏ(gu)的简单ȝ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;
  }
  解决Ҏ(gu)是用 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(hun)?(Z说一句:q个例子也提醒了?propagateIfPossible 可能令hqhQ因为它不仅传播参数指定的类型,也传?Error ?RuntimeException?
  q种模式 (或者类似的写法Q如"throw new RuntimeException(t)") 在Google的代码库里至出?30 ơ?搜烦'propagateIfPossible[^;]* Exception.class[)];'试试? 采用"throw new RuntimeException(t)"写法的略占多数。我们也有可能想要一?throwWrappingWeirdThrowable"Ҏ(gu)来做Throwable到Exception的{换,但是既然两行p搞定Q这个方法还是没有太大必要,除非我们要废除propagateIfPossibleҎ(gu)?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Ҏ(gu)?"只能承认Q部分问题在?propagate"q个名字很含p?它是一个抛出未声明exception的方式吗?) 也许换成"wrapIfChecked"会好一些。但即叫这个名字,在已知checked exception上调用它也没有什么优ѝ可能还会有副作? 也许会有比普?RuntimeException 更合适的抛出cd -- 比如Q?IllegalArgumentException?br />  我们有时也会看到在exception仅仅有可能是checked exception时用 propagate 。相Ҏ(gu)_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那可以在另一端解包,减少Ҏ(gu)处理。另外,最好打包成自定义的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)



好不Ҏ(gu) 2014-09-20 14:52 发表评论
]]>
Java下static关键字用法详?/title><link>http://www.tkk7.com/haosola/archive/2014/09/10/417811.html</link><dc:creator>好不Ҏ(gu)</dc:creator><author>好不Ҏ(gu)</author><pubDate>Wed, 10 Sep 2014 14:29:00 GMT</pubDate><guid>http://www.tkk7.com/haosola/archive/2014/09/10/417811.html</guid><wfw:comment>http://www.tkk7.com/haosola/comments/417811.html</wfw:comment><comments>http://www.tkk7.com/haosola/archive/2014/09/10/417811.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/haosola/comments/commentRss/417811.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/haosola/services/trackbacks/417811.html</trackback:ping><description><![CDATA[<p>  本文章介l了java下static关键字的用法Q大部分内容摘自原作者,在此学习(fn)q分享给大家?br />  Static关键字可以修C?<br />  从以下测试可以看出, static 可以修饰:<br />  1. 语句?br />  2. 成员变量(但是不能修饰局部变?<br />  3. Ҏ(gu)<br />  4. 接口(内部接口)<br />  5. c?只能修饰在类中的c, 即静态内部类)<br />  6. jdk 1.5 中新增的静态导?br />  那么static 修饰的表CZ么呢? 当创Z个类Ӟ是在创Z个新cdQ描q这个类的对象的外观和行为,除非用new创徏出那个类的对象,数据存储I间才被分配Q其Ҏ(gu)才供外界调用。那么当声明一个事物ؓstaticӞ意味着q个域或者方法不会与包含它的那个cȝM对象兌在一P也就是说Q它不依赖类特定的实例,被类的所有实例共享,只要q个c被加蝲QJava虚拟机就能根据类名在q行时数据区的方法区内定扑ֈ他们。因此,static对象可以在它的Q何对象创Z前访问,无需引用M对象?br />  1. static 修饰语句?<br />  static{} 可以有多处,执行序按照他们的声明顺序。当JVM加蝲q个cȝ时候,׃执行此语句块Qƈ且只执行一ơ?br />  2. static 变量:<br />  static 变量Q可以被cȝ所有对象共享,q且它只有一份存储空_JVM只ؓ静态分配一ơ内存,在加载类的过E中完成静态变量的内存分配。那么在引用static变量的时候,使用(cd.变量?是首选的方式Q因Z不仅它是staticl构Q而且在某些情况下会ؓ~译器进行优化提供更好的Z?br />  使用cd直接引用static变量是比较力荐的Q这样就很明的告诉大家该变量或属性是staticl构或是被static修饰?br />  但是我想说一个更重要的知识点。static 在类中当变量的重要用方法,首先g先运行一下下面代码试试:<br />  public class Person {<br />  static int[] arr = new int[3];<br />  public static void main(String[] args){<br />  Person per1 = new Person();<br />  Person per2 = new Person();<br />  Person per3 = new Person();<br />  System.out.println("----改变之前-----");<br />  System.out.print("per1-->");<br />  per1.show();<br />  System.out.print("per2-->");<br />  per2.show();<br />  System.out.print("per3-->");<br />  per3.show();<br />  //现在我改变它的?br />  Person.arr[2]=10;//q种Ҏ(gu)是徏议的<br />  per1.arr[0]=1;//一般不用这U方?br />  System.out.println("----改变之后-----");<br />  System.out.print("per1-->");<br />  per1.show();<br />  System.out.print("per2-->");<br />  per2.show();<br />  System.out.print("per3-->");<br />  per3.show();<br />  }<br />  //Z方便Q封装一个方法,来解?br />  public void show(){<br />  for(int i=0; i<br />  System.out.print(arr[i] + "t");<br />  }<br />  System.out.println("");<br />  }<br />  }OutputQ?br />  ----改变之前-----<br />  per1-->0t0t0t<br />  per2-->0t0t0t<br />  per3-->0t0t0t<br />  ----改变之后-----<br />  per1-->1t0t10t<br />  per2-->1t0t10t<br />  per3-->1t0t10t<br />  cM的Ş式同样应用在使用static修饰的方法上?UCؓ静态方?。它可以像普通方法一样用对象来引用Q也可以通过Ҏ(gu)的语法Ş式来调用如:“cd”+“ . ”+“Ҏ(gu)”(); 定义静态方法的方式与定义静态变量一P<br />  public class StaticTest2 {<br />  static void method(){ ("q是静态方?); }<br />  }<br />  普通的调用Ҏ(gu)QStaticTest2 st = new StaticTest2(); 因ؓmethod是static修饰?静态方?Q所以可以这栯用:StaticTest2.()?br />  3. staticҎ(gu):<br />  staticҎ(gu)与非staticҎ(gu)的区别在? staticҎ(gu)可以用类名直接访问在static内部的变量和Ҏ(gu)Q而不能引用非static的变量或者方法,但是你可以通过传递参数的方式传递一个引用,让这个引用去调用非静态数据?br />  4. static 接口:<br />  内部接口(inner interface)本n默认是staticQ所以static关键词加与不加都是一L(fng)Q?如此例中的接?TestInInterfaceQTestInClass 实现此接口, 以下语句Q?br />  StaticDescription.TestInInterface a = new StaticDescription.TestInClass();<br />  a.print();<br />  我们Lstatic关键字也是一L(fng)Q?但还是受讉K权限控制TestInterface和FF?br />  5. static 修饰c?(后部分会详细说明)<br />  表示它是一个静态内部类Q它在引用外部类的事物时Q必M是static的。而且Q?静态内部类在创q对象Ӟ 是不需要外围类的存在。就好像下面的部分:<br />  class Member {<br />  static int classVar = 0; //cd?br />  int instanceVar; //实例变量<br />  Member(int instanceVar) {<br />  this.instanceVar = instanceVar;<br />  }<br />  static void setClassVar(int i) {<br />  classVar=i;<br />  //instanceVar=i; // cL法不能访问实例变量,只能讉Kcd?br />  }<br />  static int getClassVar() {//cL?br />  return classVar;<br />  }<br />  void setInstanceVar(int i) {<br />  classVar=i; //实例Ҏ(gu)不但可以讉Kcd量,也可以实例变?br />  instanceVar=i;<br />  }<br />  int getInstanceVar() {<br />  return instanceVar;<br />  }<br />  }<br />  Member未实例化Q?Member实例化之后:<br /><br />1<br />  对于非静态数据成员,每个cd象都有自q拯。而静态数据成员被当作是类的成员。无个类的对象被定义了多个Q静态数据成员在E序中也只有一份拷贝,pcd的所有对象共享访问。也是_静态数据成员是该类的所有对象所共有的。对该类的多个对象来_静态数据成员只分配一ơ内存,供所有对象共用。所以,静态数据成员的值对每个对象都是一L(fng)Q它的值可以更?<br />  Member m1 = new Member();<br />  Member m2 = new Member();<br />  内存分配<br /><br />2<br />  引用static变量有两U方法。如前例所C,可以通过一个对象去定位它,如m1.classVar; 也可以通过其类名直接引用,如Member.classVarQ而对于非静态成员则不行?br />  管当static作用于某个字D|Q肯定会改变数据的创建方?因ؓ一个static字段Ҏ(gu)个类来说都只有一份存储空_而非static字段则是Ҏ(gu)个对象都有一个存储空?Q但是如果static用于某个Ҏ(gu)Q差别却没有那么大。staticҎ(gu)的一个重要用法就是在不创ZQ何对象的前提下就可以调用它。这一点,对定义main()Ҏ(gu)很重要,q个Ҏ(gu)是运行一个应用时的入口点?br />  staticҎ(gu)是没有this的方法。在staticҎ(gu)的内部不能调用非静态方法,反过来倒是可以的。而且可以在没有创ZQ何对象的前提下,仅仅通过cLw来调用staticҎ(gu)。这实际上正是staticҎ(gu)的主要用途。它很像全局Ҏ(gu)。Java中禁止用全局Ҏ(gu)Q但你在cM|入staticҎ(gu)可以访问其他staticҎ(gu)和static域?br />  和其他Q何方法一PstaticҎ(gu)可以创徏或用与其类型相同的被命名对象,因此QstaticҎ(gu)通常拿来?#8220;牧羊?#8221;的角Ԍ负责看护与其奴隶同一cd的实例群?br />  不过Q要是在代码中出现大量的staticҎ(gu)Q就该重新考虑自己的设计了<strong><a ><font color="#f2f2f2">sat{案</font></a></strong> <strong><em><a ><font color="#f2f2f2">www.jszj123.com</font></a></em></strong> </p><img src ="http://www.tkk7.com/haosola/aggbug/417811.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/haosola/" target="_blank">好不Ҏ(gu)</a> 2014-09-10 22:29 <a href="http://www.tkk7.com/haosola/archive/2014/09/10/417811.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最短\径之Dijkstra法详细讲解http://www.tkk7.com/haosola/archive/2014/09/10/417810.html好不Ҏ(gu)好不Ҏ(gu)Wed, 10 Sep 2014 14:21:00 GMThttp://www.tkk7.com/haosola/archive/2014/09/10/417810.htmlhttp://www.tkk7.com/haosola/comments/417810.htmlhttp://www.tkk7.com/haosola/archive/2014/09/10/417810.html#Feedback0http://www.tkk7.com/haosola/comments/commentRss/417810.htmlhttp://www.tkk7.com/haosola/services/trackbacks/417810.html  1 最短\径算?br />
  在日常生zMQ我们如果需要常常往qA地区和B地区之间Q我们最希望知道的可能是从A地区到B地区间的众多路径中,那一条\径的路途最短。最短\径问题是图论研究中的一个经典算法问题, 旨在L?q点和路径l成?中两l点之间的最短\径?法具体的Ş式包括:

  (1)定L(fng)的最短\径问题:卛_知v始结点,求最短\径的问题?br />
  (2)定l点的最短\径问题:与确定v点的问题相反Q该问题是已知终l结点,求最短\径的问题。在无向图中该问题与定L(fng)的问题完全等同,在有向图中该问题{同于把所有\径方向反转的定L(fng)的问题?br />
  (3)定L(fng)l点的最短\径问题:卛_知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用于计一个节点到其他所有节点的最短\径。主要特Ҏ(gu)以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)的最短\径。线上所标注为相?c)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 /> 



好不Ҏ(gu) 2014-09-10 22:21 发表评论
]]>
Java实现ȝE等待子U程http://www.tkk7.com/haosola/archive/2014/08/25/417317.html好不Ҏ(gu)好不Ҏ(gu)Mon, 25 Aug 2014 14:00:00 GMThttp://www.tkk7.com/haosola/archive/2014/08/25/417317.htmlhttp://www.tkk7.com/haosola/comments/417317.htmlhttp://www.tkk7.com/haosola/archive/2014/08/25/417317.html#Feedback0http://www.tkk7.com/haosola/comments/commentRss/417317.htmlhttp://www.tkk7.com/haosola/services/trackbacks/417317.html  本文介绍两种ȝE等待子U程的实现方式,?个子U程来说明:
  1、用Thread的joinQ)Ҏ(gu)QjoinQ)Ҏ(gu)会阻塞主U程l箋向下执行?br />  2、用java.util.concurrent中的CountDownLatch,是一个倒数计数器。初始化时先讄一个倒数计数初始|每调用一ơcountDownQ)Ҏ(gu)Q倒数值减一Q他的awaitQ)Ҏ(gu)会阻塞当前进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…托福{案



好不Ҏ(gu) 2014-08-25 22:00 发表评论
]]>
Java下static关键字用法详?/title><link>http://www.tkk7.com/haosola/archive/2014/08/25/417315.html</link><dc:creator>好不Ҏ(gu)</dc:creator><author>好不Ҏ(gu)</author><pubDate>Mon, 25 Aug 2014 13:54:00 GMT</pubDate><guid>http://www.tkk7.com/haosola/archive/2014/08/25/417315.html</guid><wfw:comment>http://www.tkk7.com/haosola/comments/417315.html</wfw:comment><comments>http://www.tkk7.com/haosola/archive/2014/08/25/417315.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/haosola/comments/commentRss/417315.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/haosola/services/trackbacks/417315.html</trackback:ping><description><![CDATA[<p>  Java下static关键字用法详?br />  本文章介l了java下static关键字的用法Q大部分内容摘自原作者,在此学习(fn)q分享给大家?br />  Static关键字可以修C?<br />  从以下测试可以看出, static 可以修饰:<br />  1. 语句?br />  2. 成员变量(但是不能修饰局部变?<br />  3. Ҏ(gu)<br />  4. 接口(内部接口)<br />  5. c?只能修饰在类中的c, 即静态内部类)<br />  6. jdk 1.5 中新增的静态导?br />  那么static 修饰的表CZ么呢? 当创Z个类Ӟ是在创Z个新cdQ描q这个类的对象的外观和行为,除非用new创徏出那个类的对象,数据存储I间才被分配Q其Ҏ(gu)才供外界调用。那么当声明一个事物ؓstaticӞ意味着q个域或者方法不会与包含它的那个cȝM对象兌在一P也就是说Q它不依赖类特定的实例,被类的所有实例共享,只要q个c被加蝲QJava虚拟机就能根据类名在q行时数据区的方法区内定扑ֈ他们。因此,static对象可以在它的Q何对象创Z前访问,无需引用M对象?br />  1. static 修饰语句?<br />  static{} 可以有多处,执行序按照他们的声明顺序。当JVM加蝲q个cȝ时候,׃执行此语句块Qƈ且只执行一ơ?br />  2. static 变量:<br />  static 变量Q可以被cȝ所有对象共享,q且它只有一份存储空_JVM只ؓ静态分配一ơ内存,在加载类的过E中完成静态变量的内存分配。那么在引用static变量的时候,使用(cd.变量?是首选的方式Q因Z不仅它是staticl构Q而且在某些情况下会ؓ~译器进行优化提供更好的Z?br />  使用cd直接引用static变量是比较力荐的Q这样就很明的告诉大家该变量或属性是staticl构或是被static修饰?br />  但是我想说一个更重要的知识点。static 在类中当变量的重要用方法,首先g先运行一下下面代码试试:<br />  public class Person {<br />  static int[] arr = new int[3];<br />  public static void main(String[] args){<br />  Person per1 = new Person();<br />  Person per2 = new Person();<br />  Person per3 = new Person();<br />  System.out.println("----改变之前-----");<br />  System.out.print("per1-->");<br />  per1.show();<br />  System.out.print("per2-->");<br />  per2.show();<br />  System.out.print("per3-->");<br />  per3.show();<br />  //现在我改变它的?br />  Person.arr[2]=10;//q种Ҏ(gu)是徏议的<br />  per1.arr[0]=1;//一般不用这U方?br />  System.out.println("----改变之后-----");<br />  System.out.print("per1-->");<br />  per1.show();<br />  System.out.print("per2-->");<br />  per2.show();<br />  System.out.print("per3-->");<br />  per3.show();<br />  }<br />  //Z方便Q封装一个方法,来解?br />  public void show(){<br />  for(int i=0; i<br />  System.out.print(arr[i] + "t");<br />  }<br />  System.out.println("");<br />  }<br />  }OutputQ?br />  ----改变之前-----<br />  per1-->0t0t0t<br />  per2-->0t0t0t<br />  per3-->0t0t0t<br />  ----改变之后-----<br />  per1-->1t0t10t<br />  per2-->1t0t10t<br />  per3-->1t0t10t<br />  cM的Ş式同样应用在使用static修饰的方法上?UCؓ静态方?。它可以像普通方法一样用对象来引用Q也可以通过Ҏ(gu)的语法Ş式来调用如:“cd”+“ . ”+“Ҏ(gu)”(); 定义静态方法的方式与定义静态变量一P<br />  public class StaticTest2 {<br />  static void method(){ ("q是静态方?); }<br />  }<br />  普通的调用Ҏ(gu)QStaticTest2 st = new StaticTest2(); 因ؓmethod是static修饰?静态方?Q所以可以这栯用:StaticTest2.()?br />  3. staticҎ(gu):<br />  staticҎ(gu)与非staticҎ(gu)的区别在? staticҎ(gu)可以用类名直接访问在static内部的变量和Ҏ(gu)Q而不能引用非static的变量或者方法,但是你可以通过传递参数的方式传递一个引用,让这个引用去调用非静态数据?br />  4. static 接口:<br />  内部接口(inner interface)本n默认是staticQ所以static关键词加与不加都是一L(fng)Q?如此例中的接?TestInInterfaceQTestInClass 实现此接口, 以下语句Q?br />  StaticDescription.TestInInterface a = new StaticDescription.TestInClass();<br />  a.print();<br />  我们Lstatic关键字也是一L(fng)Q?但还是受讉K权限控制TestInterface和FF?br />  5. static 修饰c?<br />  表示它是一个静态内部类Q它在引用外部类的事物时Q必M是static的。而且Q?静态内部类在创q对象Ӟ 是不需要外围类的存在。就好像下面的部分:<br />  class Member {<br />  static int classVar = 0; //cd?br />  int instanceVar; //实例变量<br />  Member(int instanceVar) {<br />  this.instanceVar = instanceVar;<br />  }<br />  static void setClassVar(int i) {<br />  classVar=i;<br />  //instanceVar=i; // cL法不能访问实例变量,只能讉Kcd?br />  }<br />  static int getClassVar() {//cL?br />  return classVar;<br />  }<br />  void setInstanceVar(int i) {<br />  classVar=i; //实例Ҏ(gu)不但可以讉Kcd量,也可以实例变?br />  instanceVar=i;<br />  }<br />  int getInstanceVar() {<br />  return instanceVar;<br />  }<br />  }<br />  Member未实例化Q?Member实例化之后:<br />1<br />  对于非静态数据成员,每个cd象都有自q拯。而静态数据成员被当作是类的成员。无个类的对象被定义了多个Q静态数据成员在E序中也只有一份拷贝,pcd的所有对象共享访问。也是_静态数据成员是该类的所有对象所共有的。对该类的多个对象来_静态数据成员只分配一ơ内存,供所有对象共用。所以,静态数据成员的值对每个对象都是一L(fng)Q它的值可以更?strong><em><a ><font color="#eeeeee">托福{案</font></a></em></strong><br />  Member m1 = new Member();<br />  Member m2 = new Member();<br />  内存分配<br />2<br />  引用static变量有两U方法。如前例所C,可以通过一个对象去定位它,如m1.classVar; 也可以通过其类名直接引用,如Member.classVarQ而对于非静态成员则不行?br />  管当static作用于某个字D|Q肯定会改变数据的创建方?因ؓ一个static字段Ҏ(gu)个类来说都只有一份存储空_而非static字段则是Ҏ(gu)个对象都有一个存储空?Q但是如果static用于某个Ҏ(gu)Q差别却没有那么大。staticҎ(gu)的一个重要用法就是在不创ZQ何对象的前提下就可以调用它。这一点,对定义main()Ҏ(gu)很重要,q个Ҏ(gu)是运行一个应用时的入口点?br />  staticҎ(gu)是没有this的方法。在staticҎ(gu)的内部不能调用非静态方法,反过来倒是可以的。而且可以在没有创ZQ何对象的前提下,仅仅通过cLw来调用staticҎ(gu)。这实际上正是staticҎ(gu)的主要用途。它很像全局Ҏ(gu)。Java中禁止用全局Ҏ(gu)Q但你在cM|入staticҎ(gu)可以访问其他staticҎ(gu)和static?strong><em><a ><font color="#eeeeee">托福{案</font></a></em></strong><br />  和其他Q何方法一PstaticҎ(gu)可以创徏或用与其类型相同的被命名对象,因此QstaticҎ(gu)通常拿来?#8220;牧羊?#8221;的角Ԍ负责看护与其奴隶同一cd的实例群?br />  不过Q要是在代码中出现大量的staticҎ(gu)Q就该重新考虑自己的设计了</p><img src ="http://www.tkk7.com/haosola/aggbug/417315.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/haosola/" target="_blank">好不Ҏ(gu)</a> 2014-08-25 21:54 <a href="http://www.tkk7.com/haosola/archive/2014/08/25/417315.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java多线E中使用synchronized说明http://www.tkk7.com/haosola/archive/2014/05/15/413682.html好不Ҏ(gu)好不Ҏ(gu)Thu, 15 May 2014 03:35:00 GMThttp://www.tkk7.com/haosola/archive/2014/05/15/413682.htmlhttp://www.tkk7.com/haosola/comments/413682.htmlhttp://www.tkk7.com/haosola/archive/2014/05/15/413682.html#Feedback0http://www.tkk7.com/haosola/comments/commentRss/413682.htmlhttp://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Ҏ(gu)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程是顺序执行的托福{案



好不Ҏ(gu) 2014-05-15 11:35 发表评论
]]>
Java实现快速批量移动文?/title><link>http://www.tkk7.com/haosola/archive/2014/05/15/413680.html</link><dc:creator>好不Ҏ(gu)</dc:creator><author>好不Ҏ(gu)</author><pubDate>Thu, 15 May 2014 03:29:00 GMT</pubDate><guid>http://www.tkk7.com/haosola/archive/2014/05/15/413680.html</guid><wfw:comment>http://www.tkk7.com/haosola/comments/413680.html</wfw:comment><comments>http://www.tkk7.com/haosola/archive/2014/05/15/413680.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/haosola/comments/commentRss/413680.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/haosola/services/trackbacks/413680.html</trackback:ping><description><![CDATA[<p>  Java实现快速批量移动文?br />  文gUd是计机资源理常用的一个操作,q在操作pȝ中可以通过文g的剪切与复制或鼠标拖动来实现。但是在Java文g的编E实CQ大多是通过复制文g到目的地Q再删除所有文件来实现的。这对于文件来说看不出什么弊端,但是如果Ud几个大的文gQ则会操作~慢q且费pȝ资源。本实例通过FilecȝrenameTo()Ҏ(gu)直接实现文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用来昄操作记录<strong><em><a ><font color="#eeeeee">托福{案</font></a></em></strong><br />  然后是模型层。对于浏览按钮,要获取源文g夹中的文件名数组和目标文件夹的\径,q就需要定义一个File型数l成员变量保存文件名Q再定义一个File型成员变量保存目标\径?br />  选择源文件的览按钮后,首先创徏一个JFileChooser文g选择器,使用JFileChoosercȝsetMultiSelectionEnabled(true);Ҏ(gu)讄可以多选,通过JFileChoosercȝshowOpenDialog(this);Ҏ(gu)昄文g选择对话框,若用L(fng)认则使用JFileChoosercȝgetSelectedFiles()Ҏ(gu)获取选中的文件数lƈ赋值给之前定义的File型数l成员变量,通过JTextField()cȝsetText("")Ҏ(gu)清空文本框以除去上一ơ操作的记录Q新Z个StringBuilder对象Q用foreach()循环遍历文g数组Q通过StringBuildercȝappend()Ҏ(gu)q接文g名称Q因为最前面多了?#8220;?#8221;Q再使用StringBuildercȝsubstring()Ҏ(gu)获取所有文件名U的字符Ԍ通过JTextFieldlcȝsetText()Ҏ(gu)文件名U字W串昄到文本框?br />  对于选择目标文g夹的览按钮Q首先创Z个JFileChooser文g选择器,使用JFileChoosercȝsetFileSelectionMode()Ҏ(gu)讄选择器只Ҏ(gu)件夹生效Q通过JFileChoosercȝshowOpenDialog()Ҏ(gu)昄文g打开对话框,使用JFileChoosercȝgetSelectedFile()Ҏ(gu)获取选择的文件夹Q最后用JTextField控g的setText()Ҏ(gu)昄文g夹到文本框?br />  对于Ud按钮的事件处理方法,首先使用数组的length属性判断文件数l有无元素,若有则用foreach()循环遍历文g数组Q对数组中的每一个文件元素创建移动目标文Ӟ通过JTextArea控g的append()Ҏ(gu)昄Ud记录Q用FilecȝrenameTo()Ҏ(gu)实现文gUdQ最后用JTextArea控g的append()Ҏ(gu)昄Ud完成信息?br />  对于关闭按钮的事件处理方法,使用Systemcȝexit()Ҏ(gu)退出程序?br />  代码如下Q?br />  import java.awt.EventQueue;<br />  public class QuickMoveFiles extends JFrame {<br />  /**<br />  *<br />  */<br />  private static final long serialVersionUID = -666045931923008374L;<br />  private JPanel contentPane;<br />  private JTextArea infoArea;<br />  private JTextField sourceFolderField;<br />  private JTextField targetFolderField;<br />  private File[] files;<br />  private File dir;<br />  /**<br />  * Launch the application.<br />  */<br />  public static void main(String[] args) {<br />  EventQueue.invokeLater(new Runnable() {<br />  public void run() {<br />  try {<br />  QuickMoveFiles frame = new QuickMoveFiles();<br />  frame.setVisible(true);<br />  } catch (Exception e) {<br />  e.printStackTrace();<br />  }<br />  }<br />  });<br />  }<br />  /**<br />  * Create the frame.<br />  */<br />  public QuickMoveFiles() {<br />  setTitle("\u5FEB\u901F\u6279\u91CF\u79FB\u52A8\u6587\u4EF6");<br />  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br />  setBounds(100, 100, 507, 299);<br />  contentPane = new JPanel();<br />  contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));<br />  setContentPane(contentPane);<br />  GridBagLayout gbl_contentPane = new GridBagLayout();<br />  gbl_contentPane.columnWidths = new int[] { 0, 178, 0, 0, 0, 0 };<br />  gbl_contentPane.rowHeights = new int[] { 0, 0, 169, 0, 0 };<br />  gbl_contentPane.columnWeights = new double[] { 0.0, 1.0, 0.0, 0.0, 0.0,<br />  Double.MIN_VALUE };<br />  gbl_contentPane.rowWeights = new double[] { 0.0, 0.0, 1.0, 0.0,<br />  Double.MIN_VALUE };<br />  contentPane.setLayout(gbl_contentPane);<br />  JLabel label = new JLabel("\u9009\u62E9\u6E90\u6587\u4EF6\uFF1A");<br />  GridBagConstraints gbc_label = new GridBagConstraints();<br />  gbc_label.anchor = GridBagConstraints.EAST;<br />  gbc_label.insets = new Insets(0, 0, 5, 5);<br />  gbc_label.gridx = 0;<br />  gbc_label.gridy = 0;<br />  contentPane.add(label, gbc_label);<br />  sourceFolderField = new JTextField();<br />  GridBagConstraints gbc_sourceFolderField = new GridBagConstraints();<br />  gbc_sourceFolderField.gridwidth = 3;<br />  gbc_sourceFolderField.insets = new Insets(0, 0, 5, 5);<br />  gbc_sourceFolderField.fill = GridBagConstraints.HORIZONTAL;<br />  gbc_sourceFolderField.gridx = 1;<br />  gbc_sourceFolderField.gridy = 0;<br />  contentPane.add(sourceFolderField, gbc_sourceFolderField);<br />  sourceFolderField.setColumns(10);<br />  JButton browserButton1 = new JButton("\u6D4F\u89C8");<br />  browserButton1.addActionListener(new ActionListener() {<br />  public void actionPerformed(ActionEvent e) {<br />  do_browserButton1_actionPerformed(e);<br />  }<br />  });<br />  GridBagConstraints gbc_browserButton1 = new GridBagConstraints();<br />  gbc_browserButton1.insets = new Insets(0, 0, 5, 0);<br />  gbc_browserButton1.gridx = 4;<br />  gbc_browserButton1.gridy = 0;<br />  contentPane.add(browserButton1, gbc_browserButton1);<br />  JLabel label_1 = new JLabel(<br />  "\u9009\u62E9\u76EE\u6807\u6587\u4EF6\u5939\uFF1A");<br />  GridBagConstraints gbc_label_1 = new GridBagConstraints();<br />  gbc_label_1.anchor = GridBagConstraints.EAST;<br />  gbc_label_1.insets = new Insets(0, 0, 5, 5);<br />  gbc_label_1.gridx = 0;<br />  gbc_label_1.gridy = 1;<br />  contentPane.add(label_1, gbc_label_1);<br />  targetFolderField = new JTextField();<br />  GridBagConstraints gbc_targetFolderField = new GridBagConstraints();<br />  gbc_targetFolderField.gridwidth = 3;<br />  gbc_targetFolderField.insets = new Insets(0, 0, 5, 5);<br />  gbc_targetFolderField.fill = GridBagConstraints.HORIZONTAL;<br />  gbc_targetFolderField.gridx = 1;<br />  gbc_targetFolderField.gridy = 1;<br />  contentPane.add(targetFolderField, gbc_targetFolderField);<br />  targetFolderField.setColumns(10);<br />  JButton browserButton2 = new JButton("\u6D4F\u89C8");<br />  browserButton2.addActionListener(new ActionListener() {<br />  public void actionPerformed(ActionEvent e) {<br />  do_browserButton2_actionPerformed(e);<br />  }<br />  });<br />  GridBagConstraints gbc_browserButton2 = new GridBagConstraints();<br />  gbc_browserButton2.insets = new Insets(0, 0, 5, 0);<br />  gbc_browserButton2.gridx = 4;<br />  gbc_browserButton2.gridy = 1;<br />  contentPane.add(browserButton2, gbc_browserButton2);<br />  JLabel label_2 = new JLabel("\u64CD\u4F5C\u8BB0\u5F55\uFF1A");<br />  GridBagConstraints gbc_label_2 = new GridBagConstraints();<br />  gbc_label_2.anchor = GridBagConstraints.EAST;<br />  gbc_label_2.insets = new Insets(0, 0, 5, 5);<br />  gbc_label_2.gridx = 0;<br />  gbc_label_2.gridy = 2;<br />  contentPane.add(label_2, gbc_label_2);<br />  JScrollPane scrollPane = new JScrollPane();<br />  GridBagConstraints gbc_scrollPane = new GridBagConstraints();<br />  gbc_scrollPane.gridwidth = 4;<br />  gbc_scrollPane.insets = new Insets(0, 0, 5, 0);<br />  gbc_scrollPane.fill = GridBagConstraints.BOTH;<br />  gbc_scrollPane.gridx = 1;<br />  gbc_scrollPane.gridy = 2;<br />  contentPane.add(scrollPane, gbc_scrollPane);<br />  infoArea = new JTextArea();<br />  scrollPane.setViewportView(infoArea);<br />  JButton moveButton = new JButton("\u79FB\u52A8");<br />  moveButton.addActionListener(new ActionListener() {<br />  public void actionPerformed(ActionEvent e) {<br />  do_moveButton_actionPerformed(e);<br />  }<br />  });<br />  GridBagConstraints gbc_moveButton = new GridBagConstraints();<br />  gbc_moveButton.insets = new Insets(0, 0, 0, 5);<br />  gbc_moveButton.gridx = 1;<br />  gbc_moveButton.gridy = 3;<br />  contentPane.add(moveButton, gbc_moveButton);<br />  JButton closeButton = new JButton("\u5173\u95ED");<br />  closeButton.addActionListener(new ActionListener() {<br />  public void actionPerformed(ActionEvent e) {<br />  do_closeButton_actionPerformed(e);<br />  }<br />  });<br />  GridBagConstraints gbc_closeButton = new GridBagConstraints();<br />  gbc_closeButton.insets = new Insets(0, 0, 0, 5);<br />  gbc_closeButton.gridx = 2;<br />  gbc_closeButton.gridy = 3;<br />  contentPane.add(closeButton, gbc_closeButton);<br />  }<br />  /**<br />  * 选择源文件的览按钮<br />  *<br />  * @param e<br />  */<br />  protected void do_browserButton1_actionPerformed(ActionEvent e) {<br />  JFileChooser chooser = new JFileChooser();// 创徏文g选择?br />  chooser.setMultiSelectionEnabled(true);// 讄文g多?br />  int option = chooser.showOpenDialog(this);// 昄文g打开对话?br />  if (option == JFileChooser.APPROVE_OPTION) {<br />  files = chooser.getSelectedFiles();// 获取选择的文件数l?br />  sourceFolderField.setText("");// 清空文本?br />  StringBuilder filesStr = new StringBuilder();<br />  for (File file : files) {// 遍历文g数组<strong><em><a ><font color="#eeeeee">托福{案</font></a></em></strong><br />  filesStr.append("? + file.getName());// q接文g名称<br />  }<br />  String str = filesStr.substring(1);// 获取所有文件名U的字符?br />  sourceFolderField.setText(str);// 讄文g名称信息到文本框<br />  } else {<br />  files = new File[0];<br />  sourceFolderField.setText("");// 清空文本?br />  }<br />  }<br />  /**<br />  * 选择目标文g夹的览按钮<br />  *<br />  * @param e<br />  */<br />  protected void do_browserButton2_actionPerformed(ActionEvent e) {<br />  JFileChooser chooser = new JFileChooser();// 创徏文g选择?br />  // 讄选择器只针对文g夹生?br />  chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);<br />  int option = chooser.showOpenDialog(this);// 昄文g打开对话?br />  if (option == JFileChooser.APPROVE_OPTION) {<br />  dir = chooser.getSelectedFile();// 获取选择的文件夹<br />  targetFolderField.setText(dir.toString());// 昄文g夹到文本?br />  } else {<br />  dir = null;<br />  targetFolderField.setText("");<br />  }<br />  }<br />  /**<br />  * 关闭按钮的事件处理方?br />  *<br />  * @param e<br />  */<br />  protected void do_closeButton_actionPerformed(ActionEvent e) {<br />  System.exit(0);<br />  }<br />  /**<br />  * Ud按钮的事件处理方?br />  *<br />  * @param e<br />  */<br />  protected void do_moveButton_actionPerformed(ActionEvent e) {<br />  if (files.length <= 0 || dir == null)// 判断文g数组有无元素<br />  return;<br />  for (File file : files) {// 遍历文g数组<strong><em><a ><font color="#eeeeee">托福{案</font></a></em></strong><br />  File newFile = new File(dir, file.getName());// 创徏Ud目标文g<br />  infoArea.append(file.getName() + "\tUd到\t" + dir);// 昄Ud记录<br />  file.renameTo(newFile);// 文gUd<br />  infoArea.append("------完成\n");// 昄Ud完成信息<br />  }<br />  // 昄操作完成<br />  infoArea.append("##################操作完成###################\n");<br />  }<br />  }</p><img src ="http://www.tkk7.com/haosola/aggbug/413680.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/haosola/" target="_blank">好不Ҏ(gu)</a> 2014-05-15 11:29 <a href="http://www.tkk7.com/haosola/archive/2014/05/15/413680.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java基础巩固之线E学?/title><link>http://www.tkk7.com/haosola/archive/2014/04/26/412957.html</link><dc:creator>好不Ҏ(gu)</dc:creator><author>好不Ҏ(gu)</author><pubDate>Sat, 26 Apr 2014 05:38:00 GMT</pubDate><guid>http://www.tkk7.com/haosola/archive/2014/04/26/412957.html</guid><wfw:comment>http://www.tkk7.com/haosola/comments/412957.html</wfw:comment><comments>http://www.tkk7.com/haosola/archive/2014/04/26/412957.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/haosola/comments/commentRss/412957.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/haosola/services/trackbacks/412957.html</trackback:ping><description><![CDATA[<p>  一、线E的学习(fn)<br />  U程是E序中执行单个Q务的序的流E?br />  U程创徏的两U方式:<br />  1、承Threadc?br />  publicstaticvoidmainQString[]argsQ?br />  {<br />  //l承Threadc覆盖父crunҎ(gu)<br />  Threadthread=newThreadQ)<br />  {<br />  @Override<br />  publicvoidrunQ)<br />  {<br />  whileQtrueQ?br />  {<br />  System.out.printlnQThread.currentThreadQ)。getNameQ)Q;<br />  }<br />  }<br />  };<br />  thread.startQ)Q?br />  }<br />  2、实现Runnable接口的runҎ(gu)<br />  publicstaticvoidmainQString[]argsQ?br />  {<br />  Threadthread=newThreadQnewRunnableQ)<br />  {<br />  @Override<br />  publicvoidrunQ)<br />  {<br />  whileQtrueQ?br />  {<br />  System.out.printlnQThread.currentThreadQ)。getNameQ)Q;<br />  }<br />  }<br />  }Q;<br />  thread.startQ)Q?br />  }<br />  ȝQ以上是Java实现多线E的两种方式Q承ThreadcdRunnable接口Q由于Javacȝ单承性,接口又可以实现多l承以及使用Runnable接口可以很好地将需要执行的d代码与线E类分离Q所以推荐用实现Runnable接口的方法去实现多ѝ但不管怎样最l都需要用Thread.startQ)Ҏ(gu)来ɾU程处于可运行状态吐舌头<br />  3、线E中startQ) Ҏ(gu)与runQ) Ҏ(gu)的区?strong><em><a ><font color="#f2f2f2">托福{案</font></a></em></strong><br />  1、startQ)Ҏ(gu)<br />  调用startQ)Ҏ(gu)是Z告诉pȝ我这儿有一个线E已l处于可q行状态,q没有开始运行,如果cpu分配了时间片Q那么JVM׃调用本线E的runQ)Ҏ(gu)来运行线E;runQ)Ҏ(gu)一旦执行结束,则本U程l止?br />  2、runQ)Ҏ(gu)<br />  runQ)Ҏ(gu)只是cȝ一个普通方法,如果直接调用runQ)Ҏ(gu)Q那么程序中只会存在一个主U程Q在调用runQ)Ҏ(gu)以后的代码,必须{待runQ)Ҏ(gu)执行完成后才能执行,直接调用其他普通方法一h有区?strong><em><a ><font color="#f2f2f2">雅思答?/font></a></em></strong><br />  ȝQ调用startQ)Ҏ(gu)可以开启一个新的线E,q在新的U程中运行runQ)Ҏ(gu)Q而直接调用runQ)Ҏ(gu)则不会开启新U程QrunQ)Ҏ(gu)q是执行于主U程中?br />  4.U程的运行结?br />  public static void mainQString[] argsQ?br />  {<br />  Thread thread = new ThreadQnew RunnableQ)<br />  {<br />  //实现了Runnable接口的runQ)Ҏ(gu)<br />  @Override<br />  public void runQ)<br />  {<br />  System.out.printlnQ?Runnable:" + Thread.currentThreadQ)。getNameQ)Q;<br />  }<br />  }Q?br />  {<br />  //l承了Threadc?q覆盖了ThreadcȝrunQ)Ҏ(gu)<br />  @Override<br />  public void runQ)<br />  {<br />  System.out.printlnQ?Thread:" + Thread.currentThreadQ)。getNameQ)Q;<br />  }<br />  };<br />  thread.startQ)Q?br />  }<br /><br />  ȝQThread的子c覆盖了父类的runQ)Ҏ(gu)Q所以执行了子类的runQ)Ҏ(gu)Q在子类的runQ)Ҏ(gu)中又没有调用传入的接口实现类的runQ)Ҏ(gu)?/p><img src ="http://www.tkk7.com/haosola/aggbug/412957.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/haosola/" target="_blank">好不Ҏ(gu)</a> 2014-04-26 13:38 <a href="http://www.tkk7.com/haosola/archive/2014/04/26/412957.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在旋转有序数l内扄定的?/title><link>http://www.tkk7.com/haosola/archive/2014/04/26/412956.html</link><dc:creator>好不Ҏ(gu)</dc:creator><author>好不Ҏ(gu)</author><pubDate>Sat, 26 Apr 2014 05:33:00 GMT</pubDate><guid>http://www.tkk7.com/haosola/archive/2014/04/26/412956.html</guid><wfw:comment>http://www.tkk7.com/haosola/comments/412956.html</wfw:comment><comments>http://www.tkk7.com/haosola/archive/2014/04/26/412956.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/haosola/comments/commentRss/412956.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/haosola/services/trackbacks/412956.html</trackback:ping><description><![CDATA[<p>  要求<br />  l定一没有重复元素的旋转数l(它对应的原数l是有序的)Q求l定元素在旋转数l内的下标(不存在的q回-1Q?br />  例如<br />  有序数组为{0,1,2,4,5,6,7},它的一个旋转数lؓ{4,5,6,7,0,1,2}.<br />  元素6在旋转数l内Q返?<br />  元素3不在旋{数组内,q回-1<br />  分析<strong><em><a ><font color="#eaeaea">托福{案</font></a></em></strong><br />  遍历一遍,可以L搞定Q时间复杂度为OQnQ,因ؓ是有序数l旋转得刎ͼq样做肯定不是最优解。有序,本能反映用二分查找,举个例子看看特点<br />  可以看出中间位置两段L(fng)有一个是有序的(不是左边Q就是右边)Q那么就可以在有序的范围内用二分查找;如果不再有序范围内,到另一半去找?br />  参考代?br />  复制代码<br />  int searchQint A[], int n, int targetQ?{<br />  int beg = 0;<br />  int end = n - 1;<br />  while Qbeg <= endQ?br />  {<br />  int mid = beg + Qend - begQ?/ 2;<br />  ifQA[mid] == targetQ?br />  return mid;<br />  ifQA[beg] <= A[mid]Q?br />  {<br />  ifQA[beg] <= target && target < A[mid]Q?br />  end = mid - 1;<br />  else<br />  beg = mid + 1;<br />  }<br />  else<br />  {<br />  ifQA[mid] < target && target <= A[end]Q?br />  beg = mid + 1;<br />  else<br />  end = mid - 1;<br />  }<br />  }<br />  return -1;<br />  }<br />  复制代码<br />  扩展<br />  上边的有求是没有重复的元素,现在E微扩展下,可以有重复的元素Q其他的要求不变?br />  思\<strong><em><a ><font color="#eaeaea">雅思答?/font></a></em></strong><br />  大致思\与原来相同,q是需要比较A[beg] ?A[mid]的关p?br />  A[beg] < A[mid] ----左边有序<br />  A[beg] > A[mid] ----双有序<br />  A[beg] = A[mid] ----++beg<br />  复制代码<br />  bool searchQint A[], int n, int targetQ?{<br />  int beg = 0;<br />  int end = n - 1;<br />  while Qbeg <= endQ?br />  {<br />  int mid = beg + Qend - begQ?/ 2;<br />  ifQA[mid] == targetQ?br />  return true;<br />  ifQA[beg] < A[mid]Q?br />  {<br />  ifQA[beg] <= target && target < A[mid]Q?br />  end = mid - 1;<br />  else<br />  beg = mid + 1;<br />  }<br />  else ifQA[beg] > A[mid]Q?br />  {<br />  ifQA[mid] < target && target <= A[end]Q?br />  beg = mid + 1;<br />  else<br />  end = mid - 1;<br />  }<br />  else<br />  ++beg;<br />  }<br />  return false;<br />  }</p><img src ="http://www.tkk7.com/haosola/aggbug/412956.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/haosola/" target="_blank">好不Ҏ(gu)</a> 2014-04-26 13:33 <a href="http://www.tkk7.com/haosola/archive/2014/04/26/412956.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java webpȝU初始化工作http://www.tkk7.com/haosola/archive/2014/04/20/412698.html好不Ҏ(gu)好不Ҏ(gu)Sun, 20 Apr 2014 01:23:00 GMThttp://www.tkk7.com/haosola/archive/2014/04/20/412698.htmlhttp://www.tkk7.com/haosola/comments/412698.htmlhttp://www.tkk7.com/haosola/archive/2014/04/20/412698.html#Feedback0http://www.tkk7.com/haosola/comments/commentRss/412698.htmlhttp://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(y)/O了?br />  ServletContextListener ?ServletContext 的监听者,如果 ServletContext 发生变化Q如服务器启动时 ServletContext 被创建,服务器关闭时 ServletContext 要被销毁?br />  在JSP文g中,application ?ServletContext 的实例,由JSP容器默认创徏。Servlet 中调?getServletContextQ)Ҏ(gu)得到 ServletContext 的实例?br />  我们使用~存的思\大概是:
  服务器启动时QServletContextListener ?contextInitializedQ)Ҏ(gu)被调用,所以在里面创徏好缓存。可以从文g中或者从数据库中d取缓存内容生成类Q用 ervletContext.setAttributeQ)Ҏ(gu)缓存类保存?ServletContext 的实例中?br />  E序使用 ServletContext.getAttributeQ)d~存。如果是 JSP,使用a pplication.getAttributeQ)。如果是 Servlet,使用 getServletContextQ)。getAttributeQ)。如果缓存发生变化(如访问计敎ͼQ你可以同时更改~存和文?数据库。或者你{变化积累到一定程序再保存Q也可以在下一步保?strong>托福{案
  服务器将要关闭时QServletContextListener ?contextDestroyedQ)Ҏ(gu)被调用,所以在里面保存~存的更攏V将更改后的~存保存回文件或者数据库Q更新原来的内容?br />  利用Servlet 容器的特性我们可以更优雅的实现系l的初始化工作?我们可以写一个listener让它实现ServletContextListener接口Q在contextInitializedQ)Ҏ(gu)中做惛_的事情。将此listener配置到web.xml中,Servlet容器如tomcat会在启动该web应用E序时调用此Ҏ(gu)?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>

好不Ҏ(gu) 2014-04-20 09:23 发表评论
]]>
Java中测试异常的多种方式http://www.tkk7.com/haosola/archive/2014/04/20/412697.html好不Ҏ(gu)好不Ҏ(gu)Sun, 20 Apr 2014 01:20:00 GMThttp://www.tkk7.com/haosola/archive/2014/04/20/412697.htmlhttp://www.tkk7.com/haosola/comments/412697.htmlhttp://www.tkk7.com/haosola/archive/2014/04/20/412697.html#Feedback0http://www.tkk7.com/haosola/comments/commentRss/412697.htmlhttp://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Ҏ(gu)?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是最Ҏ(gu)惛_的一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样的好处是可以_և的验证异常是被测Ҏ(gu)抛出来的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>

好不Ҏ(gu) 2014-04-20 09:20 发表评论
]]>
反射破坏单例的私有构造函C?/title><link>http://www.tkk7.com/haosola/archive/2014/04/04/411928.html</link><dc:creator>好不Ҏ(gu)</dc:creator><author>好不Ҏ(gu)</author><pubDate>Fri, 04 Apr 2014 01:29:00 GMT</pubDate><guid>http://www.tkk7.com/haosola/archive/2014/04/04/411928.html</guid><wfw:comment>http://www.tkk7.com/haosola/comments/411928.html</wfw:comment><comments>http://www.tkk7.com/haosola/archive/2014/04/04/411928.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/haosola/comments/commentRss/411928.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/haosola/services/trackbacks/411928.html</trackback:ping><description><![CDATA[<p>  Java的反破坏单例的U有构造函C护,最典型的就是Spring的Bean注入Q我们可以通过攚w私有构造函数来防止?br />  在Singleton中,我们只对外提供工厂方法(获取单例Q,而私有化构造函敎ͼ来防止外面多余的创徏?br />  对于一般的外部调用来说Q私有构造函数已l很安全了?br />  public class Singleton {<br />  private SingletonQ){}<br />  private static volatile Singleton instance = null;<br />  public static SingletongetInstanceQ) throws Exception {<br />  if Qinstance ==nullQ?{ //Zz度Q暂不考虑U程安全<br />  instance =new SingletonQ)Q?br />  }<br />  returninstance;<br />  }<br />  }<br />  Class singletonClass = Class.forNameQ?com.jscai.spring.demo.Singleton"Q;<br />  Constructor[] cts =singletonClass.getConstructorsQ)Q?br />  System.out.printlnQcts.lengthQ?<strong><em><a ><font color="#ebebeb">www.yztrans.com</font></a></em></strong> <br />  一般的外部调用Q编译器会校验,直接提示~译错误。而正常的反射也是找不到私有构造函数的Q所以上面的输出?.<br />  但是一些特权用户可以通过反射来访问私有构造函敎ͼq且实例化:<br />  Constructor[] cts = singletonClass.getDeclaredConstructorsQ)Q?br />  System.out.printlnQcts.lengthQ;<br />  cts[0].setAccessibleQtrueQ;<br />  Singletonsingleton = QSingletonQ?cts[0].newInstanceQ)Q?br />  上述代码首先通过反射的getDeclaredConstructorsQ)来获取所有构造函敎ͼpublic,protected,default * QpackageQ?access, andprivate constructorsQ,当然q个函数会校验调用者的权限?br />  此时默认q是不能调用U有构造函数的Q还需要把讉K权限打开setAccessibleQtrueQ,可以访问私有构造函CQ这L(fng)坏了单例的私有构造函C护?br />  如果要防御这L(fng)反射侵入Q可以修Ҏ(gu)造函敎ͼ加上W二ơ实例化的检查。(上面的getInstanceQ)l过多线E(DoubleCheckQ处理后Q就不会出现U程冲突来触发这个异常)<br />  private static int cntInstance = 0;<br />  private SingletonQ)throws Exception {<br />  if Q?+cntInstance > 1 Q?{<br />  throw new ExceptionQ?Can'tcreate another instance."Q;<br />  }<br />  }<br />  另外Q在Spring的Bean注入中,即你私有化构造函敎ͼ默认他还是会去调用你的私有构造函数去实例化?【通过BeanFactory来装配Bean,和上面的逻辑如出一辙?br />  所以,如果我们想保证实例的单一性,p在定?lt;bean>时加上factory-method=""的属性,q且在私有构造函Cd防M机制。单例的getInstanceQ)可能会添加一些逻辑Q而Spring的默认调用构造函数去创徏Q就不能保证q䆾逻辑的准性,所以会带来隐?zhn)?br />  我们可以通过scope="prototype"来测试单例是否被多次创徏Q?br />  <beanid="test"class="com.jscai.spring.demo.Singleton"scope="prototype"></bean><br />  BeanFactory bf = new ClassPathXmlApplicationContextQ?demoAppTestContext.xml"Q;<br />  Singleton test1 = QSingletonQ?bf.getBeanQ?singleton"Q;<br />  Singleton test2 = QSingletonQ?bf.getBeanQ?singleton"Q;<br />  发现防M机制生效Q抛?Can't create another instance."的异常,证明Spring能正常调用私有的构造函数来创徏Bean,q且创徏了多ơ?br />  q时候我们要使用factory-method来指定工厂方法,才能辑ֈ我们惌的效?<strong><em><a ><font color="#ebebeb">www.tygj123.com</font></a></em></strong> <br />  <beanid="test"class="com.jscai.spring.demo.Singleton"scope="prototype"factory-method="getInstance"></bean></p><img src ="http://www.tkk7.com/haosola/aggbug/411928.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/haosola/" target="_blank">好不Ҏ(gu)</a> 2014-04-04 09:29 <a href="http://www.tkk7.com/haosola/archive/2014/04/04/411928.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java写入文g的几U方法小l?/title><link>http://www.tkk7.com/haosola/archive/2014/03/23/411370.html</link><dc:creator>好不Ҏ(gu)</dc:creator><author>好不Ҏ(gu)</author><pubDate>Sun, 23 Mar 2014 01:54:00 GMT</pubDate><guid>http://www.tkk7.com/haosola/archive/2014/03/23/411370.html</guid><wfw:comment>http://www.tkk7.com/haosola/comments/411370.html</wfw:comment><comments>http://www.tkk7.com/haosola/archive/2014/03/23/411370.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/haosola/comments/commentRss/411370.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/haosola/services/trackbacks/411370.html</trackback:ping><description><![CDATA[<p>  java写入文g的几U方法小l?br />  一QFileWritter写入文g<br />  FileWritter, 字符写入字W到文g。默认情况下Q它会用新的内容取代所有现有的内容Q然而,当指定一个true Q布?yu)(dng))g为FileWritter构造函数的W二个参敎ͼ它会保留现有的内容,q追加新内容在文件的末尾 <strong><em><a ><font color="#ebebeb">www.jx-jf.com</font></a></em></strong> <br />  1. 替换所有现有的内容与新的内宏V?br />  new FileWriterQfileQ;2. 保留现有的内容和附加在该文g的末新内宏V?br />  代码如下<br />  new FileWriterQfile,trueQ;<br />  q加文gCZ<br />  一个文本文Ӟ命名?javaio-appendfile.txt",q包含以下内宏V?br />  ABC Helloq加新内?new FileWriterQfile,trueQ?br />  代码如下<br />  package com.yiibai.file;<br />  import java.io.File;<br />  import java.io.FileWriter;<br />  import java.io.BufferedWriter;<br />  import java.io.IOException;<br />  public class AppendToFileExample<br />  {<br />  public static void mainQ?String[] args Q?br />  {<br />  try{<br />  String data = " This content will append to the end of the file";<br />  File file =new FileQ?javaio-appendfile.txt"Q;<br />  //if file doesnt exists, then create it<br />  ifQ!file.existsQ)Q{<br />  file.createNewFileQ)Q?br />  }<br />  //true = append file<br />  FileWriter fileWritter = new FileWriterQfile.getNameQ)QtrueQ;<br />  BufferedWriter bufferWritter = new BufferedWriterQfileWritterQ;<br />  bufferWritter.writeQdataQ;<br />  bufferWritter.closeQ)Q?br />  System.out.printlnQ?Done"Q;<br />  }catchQIOException eQ{<br />  e.printStackTraceQ)Q?br />  }<br />  }<br />  }<br />  l果<br />  现在Q文本文?javaio-appendfile.txt"内容更新如下Q?br />  ABC Hello This content will append to the end of the file<br />  二,BufferedWriter写入文g<br />  ~冲字符QBufferedWriter Q是一个字W流cL处理字符数据。不同于字节(数据转换成字节)Q你可以直接写字W串Q数l或字符数据保存到文件?br />  代码如下<br />  package com.yiibai.iofile;<br />  import java.io.BufferedWriter;<br />  import java.io.File;<br />  import java.io.FileWriter;<br />  import java.io.IOException;<br />  public class WriteToFileExample {<br />  public static void mainQString[] argsQ?{<br />  try {<br />  String content = "This is the content to write into file";<br />  File file = new FileQ?/users/mkyong/filename.txt"Q;<br />  // if file doesnt exists, then create it<br />  if Q!file.existsQ)Q?{<br />  file.createNewFileQ)Q?br />  }<br />  FileWriter fw = new FileWriterQfile.getAbsoluteFileQ)Q;<br />  BufferedWriter bw = new BufferedWriterQfwQ;<br />  bw.writeQcontentQ;<br />  bw.closeQ)Q?br />  System.out.printlnQ?Done"Q;<br />  } catch QIOException eQ?{<br />  e.printStackTraceQ)Q?br />  }<br />  }<br />  }<br />  三,FileOutputStream写入文g www.jx-jf.com  <br />  文g输出是一U用于处理原始二q制数据的字节流cRؓ了将数据写入到文件中Q必d数据转换为字节,q保存到文g。请参阅下面的完整的例子?br />  代码如下<br />  package com.yiibai.io;<br />  import java.io.File;<br />  import java.io.FileOutputStream;<br />  import java.io.IOException;<br />  public class WriteFileExample {<br />  public static void mainQString[] argsQ?{<br />  FileOutputStream fop = null;<br />  File file;<br />  String content = "This is the text content";<br />  try {<br />  file = new FileQ?c:/newfile.txt"Q;<br />  fop = new FileOutputStreamQfileQ;<br />  // if file doesnt exists, then create it<br />  if Q!file.existsQ)Q?{<br />  file.createNewFileQ)Q?br />  }<br />  // get the content in bytes<br />  byte[] contentInBytes = content.getBytesQ)Q?br />  fop.writeQcontentInBytesQ;<br />  fop.flushQ)Q?br />  fop.closeQ)Q?br />  System.out.printlnQ?Done"Q;<br />  } catch QIOException eQ?{<br />  e.printStackTraceQ)Q?br />  } finally {<br />  try {<br />  if Qfop != nullQ?{<br />  fop.closeQ)Q?br />  }<br />  } catch QIOException eQ?{<br />  e.printStackTraceQ)Q?br />  }<br />  }<br />  }<br />  }<br />  更新的JDK7例如Qwww.111cn.net使用新的"试资源关闭"的方法来L处理文g?br />  package com.yiibai.io;<br />  import java.io.File;<br />  import java.io.FileOutputStream;<br />  import java.io.IOException;<br />  public class WriteFileExample {<br />  public static void mainQString[] argsQ?{<br />  File file = new FileQ?c:/newfile.txt"Q;<br />  String content = "This is the text content";<br />  try QFileOutputStream fop = new FileOutputStreamQfileQ) {<br />  // if file doesn't exists, then create it<br />  if Q!file.existsQ)Q?{<br />  file.createNewFileQ)Q?br />  }<br />  // get the content in bytes<br />  byte[] contentInBytes = content.getBytesQ)Q?br />  fop.writeQcontentInBytesQ;<br />  fop.flushQ)Q?br />  fop.closeQ)Q?br />  System.out.printlnQ?Done"Q;<br />  } catch QIOException eQ?{<br />  e.printStackTraceQ)Q?br />  }<br />  }<br />  }</p><img src ="http://www.tkk7.com/haosola/aggbug/411370.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/haosola/" target="_blank">好不Ҏ(gu)</a> 2014-03-23 09:54 <a href="http://www.tkk7.com/haosola/archive/2014/03/23/411370.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中接口之间的l承http://www.tkk7.com/haosola/archive/2014/03/23/411369.html好不Ҏ(gu)好不Ҏ(gu)Sun, 23 Mar 2014 01:49:00 GMThttp://www.tkk7.com/haosola/archive/2014/03/23/411369.htmlhttp://www.tkk7.com/haosola/comments/411369.htmlhttp://www.tkk7.com/haosola/archive/2014/03/23/411369.html#Feedback0http://www.tkk7.com/haosola/comments/commentRss/411369.htmlhttp://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 />  然后我又做了个实验,来验证如果多个父子接口中有多个相同的Ҏ(gu)声明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里面声明了三个Ҏ(gu)和一个变量;
  然后再与了一个接口: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 }
  里面也声明了三个Ҏ(gu)和一个变量;
  然后再定义了一个接口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有一个共同的Ҏ(gu)声明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Ҏ(gu)实现了,同时也没有ؓ有多个get要实现而冲H。同Ӟ如果删除了接口InterfaceMultiInheritance.java中的getҎ(gu)Q也只有一个getҎ(gu)得到了实现ƈ且没有ؓ多个get要实现而出C么冲H?br />  所以,我们可以得到一个结论,当编译器在实现接口的时候会依然查接口InterfaceMultiInheritance.java、TestInterfaceA.java和TestInterfaceB.java中的Ҏ(gu)声明Q如果后两者有与前者相冲突的方法声明,~译器将只要求类实现前者的声明Q而后两者中相同的方法声明将自动被忽略。而当只有后两者中有相同的Ҏ(gu)声明Ӟ~译器将实现其中的一个即可。就好像是编译器中有一个专门存储方法声明的Set一P在有l承关系的接口中Q只保存一ơ相同的Ҏ(gu)声明 www.jx-jf.com



好不Ҏ(gu) 2014-03-23 09:49 发表评论
]]>
Java中的反射的应?/title><link>http://www.tkk7.com/haosola/archive/2014/03/18/411179.html</link><dc:creator>好不Ҏ(gu)</dc:creator><author>好不Ҏ(gu)</author><pubDate>Tue, 18 Mar 2014 09:21:00 GMT</pubDate><guid>http://www.tkk7.com/haosola/archive/2014/03/18/411179.html</guid><wfw:comment>http://www.tkk7.com/haosola/comments/411179.html</wfw:comment><comments>http://www.tkk7.com/haosola/archive/2014/03/18/411179.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/haosola/comments/commentRss/411179.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/haosola/services/trackbacks/411179.html</trackback:ping><description><![CDATA[<p>  在正常情况下Q需要先有一个类的完整\径引入之后才可以按照固定的格式生实例话对象Q但是在Java中也允许通过一个实例话对象扑ֈ一个类的完整信息。那么这是Classcȝ功能?br />  实际上类是Java反射的源_实际上所谓反从E序的运行结果来看也很好理解Q即可以通过对象的反求出类的名U?br />  实例化Classc,获得字节码文件的Ҏ(gu)有三U:<br />  W一U:通过forNameQ)Ҏ(gu)Q第二种Q类。classW三U:对象。getClassQ)<br />  package toto.learn;<br />  class X1{}<br />  publicclass GetClassDemo02 {<br />  publicstaticvoid mainQString[] argsQ?{<br />  Class c1=null;//指定泛型<br />  Class c2=null;//指定泛型<br />  Class c3=null;//指定泛型<br />  try{<br />  c1=Class.forNameQ?toto.learn.X"Q;//最常用的Ş式,q种方式字节码文g加蝲到内存中?br />  }catchQClassNotFoundException eQ{<br />  e.printStackTraceQ)Q?br />  }<br />  c2 = new X1Q)。getClassQ)Q?/通过ObjectcM的方法实?br />  c3 = X1.class;//通过cclass实例?br />  System.out.printlnQ?cdUͼ"+c1.getNameQ)Q;//得到cȝ名称<br />  System.out.printlnQ?cdUͼ"+c2.getNameQ)Q;//得到cȝ名称<br />  System.out.printlnQ?cdUͼ"+c3.getNameQ)Q;//得到cȝ名称<br />  }<br />  }<br />  通过以上Ҏ(gu)获得cdU的方式得到的是包名+cd<br />  如果要想通过ClasscLw实例化其他cȝ对象Q则可以使用newInstanceQ)Ҏ(gu)Q但是必要保证被实例化的类中必d在一个无参够造方法?br />  被实例化对象的类中必d在无参构造方法,如果不存在的话,则肯定是无法实例化的?br />  1?通过ClasscM的getConstructorsQ)取得本类中的全部构造方?br />  2?向构造方法中传递一个对象数l进去,里面包含了构造方法中所需的各个参?br />  3?之后通过Constructor实例化对象?br />  package org.lxh.demo15.instancedemo;<br />  import java.lang.reflect.Constructor;<br />  publicclass InstanceDemo03 {<br />  publicstaticvoid mainQString[] argsQ?{<br />  Class c = null;<br />  try {<br />  c = Class.forNameQ?org.lxh.demo15.instancedemo.Person"Q; // 声明Class对象<br />  } catch QClassNotFoundException eQ?{<br />  e.printStackTraceQ)Q?br />  }<br />  Person per = null; // 声明Person对象<br />  Constructor cons[] = null; // 声明一个表C构造方法的数组<br />  cons = c.getConstructorsQ)Q?// 通过反射Q取得全部构?br />  try {// 向构造方法中传递参敎ͼ此方法用可变参数接Ӟq实例化对象<br />  per = QPersonQ?cons[0].newInstanceQ?李兴?, 30Q;<br />  } catch QException eQ?{ // 因ؓ只有一个构造,所以数l下标ؓ0<br />  e.printStackTraceQ)Q?br />  }<br />  System.out.printlnQperQ; // 输出对象<br />  }<br />  }<br />  per = QPersonQcons[0].newInstanceQ?李兴?, 30Q; //此处是调用ƈ使用构造方法的部分?br />  在声明对象数l的时候,必须考虑到构造方法中参数的类型顺序,所以第一个参数的cd为Stirng,W二个参数的cdWieIntegerQ在使用是可以自动拆)<br />  Constructorcons[]=null;//实例化构造方法的数组<br />  Cons =c.getConstructorsQ)Q?/取得全部构?br />  //向构造方法中传递参敎ͼ此方使用可变参数接收Qƈ实例化对?br />  Per = QPersonQcons[0].newInstanceQ?李兴?,30Q;<br />  讄构造方法的参数内容<br />  publicPersonQString name,int ageQ{//通过构造设|属性内?br />  }<br />  反射的应?br />  可以使用反射取得实现的全部接?br />  可以使用反射取得一个类所l承的父c?br />  可以使用反射取得一个类中的全部构造方?br />  可以使用反射取得一个类中的全部Ҏ(gu)<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)Ҏ(gu)。此Ҏ(gu)定义如下Q?br />  publicClass[] getInterfacesQ)Q?br />  此方法返回一个Classcȝ对象数组Q之后就可以直接利用ClasscM的getNameQ)Ҏ(gu)输出卛_?br />  通过反射取得实现的全部接?br />  package org.lxh.demo15;<br />  publicclass GetInterfaceDemo {<br />  publicstaticvoid mainQString[] argsQ?{<br />  Class c1 =null;//声明Class对象<br />  try{<br />  c1 = Class.forNameQ?org.lxh.demo15.Person"Q;//实例化Class对象<br />  }catchQClassNotFoundException eQ{<br />  e.printStackTraceQ)Q?br />  }<br />  Class c[] = c1.getInterfacesQ)Q?/取得实现的全部接?br />  forQint i=0;i<br />  System.out.printlnQ?实现的接口名Uͼ"+c[i].getNameQ)Q;//输出接口名称<br />  }<br />  }<br />  }<br />  一个类中可以实现多个接口,但是只能l承一个父c,所以如果要惛_得一个类的父c,可以直接使用ClasscM的getSuperclassQ)Ҏ(gu)。此Ҏ(gu)定义如下Q?br />  PublicClass getSuperclassQ)<br />  此方法返回的是Class实例Q和之前的得到接口一P可以通过getNameQ)Ҏ(gu)取得名称?br />  取得构造方法的例子Q?br />  package org.lxh.demo15;<br />  import java.lang.reflect.Constructor;//导入反射操作?br />  publicclass GetConstructorDemo01 {<br />  publicstaticvoid mainQString[] argsQ?{<br />  Class c1 = null;//声明Class对象<br />  try{<br />  c1 = Class.forNameQ?org.lxh.demo15.Person"Q;<br />  }catchQClassNotFoundException eQ{<br />  e.printStackTraceQ)Q?br />  }<br />  Constructor con[]=c1.getConstructorsQ)Q?/得到全部构造方?br />  forQint i=0;i<br />  System.out.printlnQ?构造方法:"+con[i]Q;//直接打印输出<br />  }<br />  }<br />  }<br />  q原修饰W?br />  在整个Java中对于方法的修饰W用一定的数字表示出来的,而如果要xq个数字q原成用户可以看懂的关键字,则必M靠Modifiercd成,此类定义在java.lang.reflect包中。直接用Modifercȝ一下方法可修饰W:<br />  publicstatic String toStringQint modQ?br />  int mo = con[i].getModifiersQ)Q?br />  System.out.printQModifier.toStringQmoQ?""Q; //q原权限<br />  getDeclaredMethodsQ)Ҏ(gu)Q此Ҏ(gu)q回一个Methodcȝ对象数组Q而如果要惌一步取得方法具体信息,例如Q方法的参数Q抛出的异常声明{等Q则是必须依靠Methodc?br />  再反操作中同样可以取得一个类中的全部属性,但是在取得属性的时候有以下两种不同的操作:<br />  得到实现的接口或父类中的公共属性:public Field[] getFieldsQ) throwsSecurityException<br />  得到本类中自己定义的的全部属性:public Field[] getDeclaredFieldsQ) throws SecurityException<br />  如果要用反调用类中的Ҏ(gu)可以通过Methodcd成,操作步骤如下Q?br />  1?通过ClasscȝgetMethodQStringname,Class…parameterTypesQ方法取得一个Method的对象,q设|此Ҏ(gu)操作时所需的参数类型?br />  2?之后才可以用invokeq行调用Qƈ向方法中传递要讄的参?strong><em><a ><font color="#efefef">托福{案</font></a></em></strong> <strong><em><a ><font color="#efefef">www.jamo123.com</font></a></em></strong> <br />  在ProxycM的newProxyInstanceQ)Ҏ(gu)中,需要一个ClassLoadercȝ实例QClassLoader实际上对应的是类加蝲器,在Java中主要有以下三种cd载器Q?br />  BootstrapClassLoader:此加载器采用C++ ~写Q一般开发中是看不到的;<br />  ExtensionClassLoader:用来q行扩展cȝ加蝲Q一般对应的是jre\lib\ext目录中的c;<br />  AppClassLoader:加蝲classpath指定的类Q是最常用使用的一U加载器?br />  通过forNameQ)加蝲cMơ时Q此时的cd加蝲了一?br />  如果有以下代码:<br />  Object obj= new VipUserQ)Q?/q里VipUser是User的子c,它承了User<br />  ifQobj instanceof UserQ{<br />  System.out.printlnQ?instanceof判断是一个user"Q;<br />  User user = QUserQobj;<br />  }<br />  当用以上代码中的instanceof来判断时Q此时obj是一个User了,但实际上它不是。它只是User的一个子cR?br />  ȝQ用instanceof时主要用来判断是否实C后面的接口?br />  ifQobj.getClassQ)==User.classQ{<br />  System.out.printlnQ?getClass判断Q是一个user"Q;<br />  User user = QUserQobj;<br />  }<br />  而getClassQ)用于判断对象的准类型?br />  在后面用到的c:<br />  package toto.learn1;<br />  publicclass User {<br />  private String name;<br />  private String password;<br />  private String gender;<br />  public UserQString name, String password, String genderQ?{<br />  superQ)Q?br />  this.name = name;<br />  this.password = password;<br />  this.gender = gender;<br />  }<br />  public UserQ) {<br />  superQ)Q?br />  // TODO Auto-generatedconstructor stub<br />  }<br />  public UserQString name, String passwordQ?{<br />  superQ)Q?br />  this.name = name;<br />  this.password = password;<br />  }<br />  public String getNameQ) {<br />  returnname;<br />  }<br />  publicvoid setNameQString nameQ?{<br />  this.name = name;<br />  }<br />  public String getPasswordQ) {<br />  returnpassword;<br />  }<br />  publicvoid setPasswordQString passwordQ?{<br />  this.password = password;<br />  }<br />  public String getGenderQ) {<br />  returngender;<br />  }<br />  publicvoid setGenderQString genderQ?{<br />  this.gender = gender;<br />  }<br />  publicvoid runQString str, int numQ{<br />  System.out.printlnQ?run"Q;<br />  }<br />  publicvoid runQString nameQ{<br />  System.out.printlnQ?hello:"+nameQ;<br />  }<br />  }<br />  以下是关于反的部分?br />  package toto.learn1;<br />  import java.lang.reflect.Constructor;<br />  import java.lang.reflect.Field;<br />  import java.lang.reflect.Method;<br />  import java.lang.reflect.Modifier;<br />  publicclass Demo2 {<br />  /**<br />  * 反射<br />  * @throwsIllegalAccessException<br />  * @throwsInstantiationException<br />  * @throwsNoSuchMethodException<br />  * @throwsSecurityException<br />  */<br />  publicstaticvoid mainQString[] argsQ?throws Exception {<br />  Class clazz = User.class;<br />  //构造方?br />  //获得构造方?br />  Constructor[] cons = clazz.getConstructorsQ)Q?br />  forQConstructor con : consQ{<br />  //参数列表Q获得的U定是完整的参数cdQ包括这U类型坐在的包?br />  Class[] types = con.getParameterTypesQ)Q?br />  System.out.printlnQ?参数cd为:"Q;<br />  forQClass type:typesQ{<br />  System.out.printlnQtype.getNameQ)+"…"Q;<br />  }<br />  System.out.printlnQ)Q?br />  }<br />  //获得指定的构造方?创徏对象<br />  try {<br />  Object obj = clazz.newInstanceQ)Q?/默认调用无参的构造方?br />  System.out.printlnQobj.getClassQ)Q;<br />  } catch QInstantiationException eQ?{<br />  e.printStackTraceQ)Q?br />  } catch QIllegalAccessException eQ?{<br />  e.printStackTraceQ)Q?br />  }<br />  /**参数cd为:<br />  java.lang.String…<br />  java.lang.String…<br />  参数cd为:<br />  java.lang.String…<br />  java.lang.String…<br />  java.lang.String…<br />  class toto.learn1.User*/<br />  System.out.printlnQ?-------------------------"Q;<br />  //获得指定的构造方? 创徏对象<br />  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 查看<br />  //Ҏ(gu)<br />  //获得cL有的Ҏ(gu)<br />  Method [] methods = clazz.getMethodsQ)Q?br />  forQMethod method:methodsQ{<br />  System.out.printlnQmethod.getNameQ)Q;<br />  }<br />  /**通过getMethodsQ)Ҏ(gu)获得的类中包含有父类的方法,q且拿到的是共有的方?br />  * run<br />  run<br />  getName<br />  setName<br />  getPassword<br />  setPassword<br />  getGender<br />  setGender<br />  wait<br />  wait<br />  wait<br />  hashCode<br />  getClass<br />  equals<br />  toString<br />  notify<br />  notifyAll<br />  * */<br />  //如果惌得声明的所有方法,包括非public的,不包括承的Q可以用一下途径实现<br />  System.out.printlnQ?-----------------------"Q;<br />  Method [] methods2 = clazz.getDeclaredMethodsQ)Q?br />  forQMethod method:methods2Q{<br />  System.out.printlnQmethod.getNameQ)Q;<br />  }<br />  /**l果是:<br />  * run<br />  run<br />  getName<br />  setName<br />  getPassword<br />  setPassword<br />  getGender<br />  setGender*/<br />  //获得指定的方法,调用Ҏ(gu)<br />  Method runMethod = clazz.getMethodQ?run", String.classQ; /**W一个表C调用那个Ҏ(gu)<br />  W二个参数是可变参数Q表C用的润方法的参数cd?/<br />  //获得了方法后Q要执行Ӟ得给Z个对象,在这里要执行的对象是User,故作如下实例<br />  User usr1 = new UserQ)Q?br />  runMethod.invokeQusr1, "toto"Q;//表示执行usr1对象中的runMethodҎ(gu)Qƈ且向Ҏ(gu)中传递了参数?br />  /**<br />  * q行l果Qhello:toto 此ؓUsercMrunQString nameQ;Ҏ(gu)输出的结果,其中name即ؓtoto*/<br />  //属?strong><em><a ><font color="#efefef">托福{案</font></a></em></strong> <strong><em><a ><font color="#efefef">www.lefeng123.com</font></a></em></strong> <br />  //获得对象的属性,先创Z个对?br />  Object object = new UserQ?toto","123","male"Q;//调用User中的构造方法:<br />  //׃获得对象的私有属性,得获得getҎ(gu)Q故得先获得对象的字节码文gQ通过q个文g获得getҎ(gu)<br />  Class objectClazz = object.getClassQ)Q?br />  //获得getҎ(gu)<br />  Method runMethod2 = clazz.getMethodQ?getName"Q; //׃该方法没有参敎ͼ故不用在向里面传递参?br />  //执行此方法,输出参数<br />  Object name = runMethod2.invokeQobjectQ;<br />  System.out.printlnQnameQ;//׃上面传递了name|故此处返回的l果gؓQtoto<br />  //获得所有属?br />  System.out.printlnQ?-------------------------------"Q;<br />  //Field[] fields =clazz.getFieldsQ)Q?/此方法拿到的是public的属性,׃UsercM没有共有的属?br />  Field[] fields = clazz.getDeclaredFieldsQ)Q?/拿到声明的属?br />  forQField fd : fieldsQ{<br />  System.out.printlnQfd.getNameQ)+"属性类型: "+fd.getTypeQ)Q;<br />  }<br />  /** l果为:<br />  * name属性类型: class java.lang.String<br />  password属性类型: class java.lang.String<br />  gender属性类型: class java.lang.String*/<br />  //为对象的password属性赋|<br />  User user2 = new UserQ)Q?br />  String fieldName = "password";//作ؓ变量来处理的Q可以传递Q意的属性名U?br />  //getpw是通过反射拿到的属性,其实是password<br />  Field getpw = user2.getClassQ)。getDeclaredFieldQfieldNameQ;<br />  //判断属性是否ؓU有Q?br />  int num = getpw.getModifiersQ)Q?/q回的是整型的倹{?br />  ifQnum == Modifier.PRIVATEQ{//获得的是<br />  System.out.printlnQ?属性是U有?Q;<br />  //让java虚拟Z查访问权?br />  //getpw.setAccessibleQtrueQ;<br />  }<br />  //System.out.printlnQgetpwQ;//l果private java.lang.Stringtoto.learn1.User.password<br />  getpw.setQuser2, 234567Q;//前一个参数表C的是ؓ那个对象赋密码?br />  System.out.printlnQuser2.getPasswordQ)Q;<br />  }<br />  }<br />  通过Fieldc访问对象属性时Q需要注意访问权限的问题Q若对象的属性被声明为私有,则无法访问,此时需要打开java语言查filed.setAccessibleQtrueQ;<br />  MethodcM表某个类中的一个成员方法通过invokeҎ(gu)可以调用Method表示的方法,此时同样需要传递对象给Method,若被调用的方法ؓ静态,则传入一个null?br />  注意Qjdk1.4和jdk1.5的invokeҎ(gu)的区别:<br />  Jdk1.5:public Object invokeQObjectobj,Object… argsQ?br />  Jdk1.4:public Object invokeQObjectobj,Object[] argsQ?br />  当传入一个数l时Qؓ了向后兼容,虚拟Z优先考虑考虑调用JDK1.4的方?/p><img src ="http://www.tkk7.com/haosola/aggbug/411179.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/haosola/" target="_blank">好不Ҏ(gu)</a> 2014-03-18 17:21 <a href="http://www.tkk7.com/haosola/archive/2014/03/18/411179.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用UrlRewriteFilter对urlq行更替http://www.tkk7.com/haosola/archive/2014/03/17/411146.html好不Ҏ(gu)好不Ҏ(gu)Mon, 17 Mar 2014 13:06:00 GMThttp://www.tkk7.com/haosola/archive/2014/03/17/411146.htmlhttp://www.tkk7.com/haosola/comments/411146.htmlhttp://www.tkk7.com/haosola/archive/2014/03/17/411146.html#Feedback0http://www.tkk7.com/haosola/comments/commentRss/411146.htmlhttp://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&amp;scope=vmcontent&amp;columninfoid=$1</to>
需要注意的地方是:用括hh的正则表辑ּ为变量,如to标签里面?1表示的是上面from里面的第一个括号内宏Vurl里面的参数间隔符 '&'应该写ؓ'&amp;'.
值得注意的是<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束



好不Ҏ(gu) 2014-03-17 21:06 发表评论
]]>
վ֩ģ壺 һѹۿ| AVպAVһ| AVרӰ߹ۿ| þþƷƷ | avһ| ҹƷþþþ | ؼaƬëƬѿ| Ļ߾Ʒһ| ִӲִֻƵƵѿ | ߿Ƭ˳Ƶ| պƵ߹ۿ| þþƵ| 18paoƵ| 츾ӰƬ| ձaƬѿ| ߹ۿ| AV뾫Ʒ| 鶹avŮһ| ޳߹ۿ| ҹþ| ˳Ƶ߹ۿ| Ļaѿ| պƵһ| www.999ƷƵۿ| պһ߲ѹۿ| ˳߹ۿŹ | ޹Ʒר߹ۿ| þþƷav| ޹Ʒۺ˳ۺվ| 츾AV߹ۿ| һƵ| Ʒһ| avþþþòվ| պĻѹۿ| ޾Ʒþþþϼ| ԴƵ| ޹ƷŮþþþ| ҹƵ| ޻ɫվ| һëƬ߲| AVþþƷ|