﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-JiangZone-随笔分类-Java</title><link>http://www.blogjava.net/cph8066/category/33391.html</link><description>天将降大任于是人也！</description><language>zh-cn</language><lastBuildDate>Tue, 29 Jul 2008 06:29:09 GMT</lastBuildDate><pubDate>Tue, 29 Jul 2008 06:29:09 GMT</pubDate><ttl>60</ttl><item><title>Java制作自动访问网站机器人！</title><link>http://www.blogjava.net/cph8066/archive/2008/07/29/218363.html</link><dc:creator>姜大叔</dc:creator><author>姜大叔</author><pubDate>Tue, 29 Jul 2008 05:09:00 GMT</pubDate><guid>http://www.blogjava.net/cph8066/archive/2008/07/29/218363.html</guid><wfw:comment>http://www.blogjava.net/cph8066/comments/218363.html</wfw:comment><comments>http://www.blogjava.net/cph8066/archive/2008/07/29/218363.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cph8066/comments/commentRss/218363.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cph8066/services/trackbacks/218363.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 真的很久很久没有写过文章了，唉，惭愧啊！寒暄的说话就不多说了，直入主题。有人问过我，如何制作一些论坛的自动发言机器人？我说，这很简单啊，（如果没有图片验证码的话！）在Java里，有些URL，URLConnection的类啊，这些类可以访问一个URL获取数据，可以发送Request，你就可以结合一些类做一个自动发言的了，但用Post发送表单的话，就没有直接的，比较麻烦，如果还要处理Cookie的话，之后我想了想，想到了可以用Jakarta Commons 下面的开源项目啊，有一个项目名叫&#8220;HttpClient&#8221;的，这个就是用Java写的Http客户端，可以说是一个简单功能的浏览器吧，只是不能解析HTML标签，写这个解析可不是易事。既然我们是写个自动访问网站的程序，就不用解析显示HTML啦。朋友说能写个招聘网站的自动刷新简历的程序就好了，那就用51job为例吧。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先，你得去下载HttpClient的包。<br />
<a title="http://jakarta.apache.org/commons/httpclient" href="http://jakarta.apache.org/commons/httpclient">http://jakarta.apache.org/commons/httpclient</a><br />
<br />
代码不多，我们就先来看看代码吧：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.apache.commons.httpclient.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.apache.commons.httpclient.methods.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;HttpTest&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;args<br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@throws</span><span style="color: #008000;">&nbsp;Exception<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">先建立一个客户端实例，将模拟一个浏览器</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpClient&nbsp;client&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;HttpClient();<br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">这个是URL地址，我经过分析51job网站登录后的跳转到的地址，并分析得它在JavaScript里提交的URL的参数，不同网站就自已分析了，这个就是登录后刷新简历的URL地址</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;url&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">http://my.51job.com/my/Pop_RefreshResume.php?en=0&amp;ReSumeID=88888888&amp;Read=0&amp;ID=88888888</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">之后再建立一个Post方法请求，提交刷新简历的表单，因为提交的参数较多，所以用Post请求好了</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostMethod&nbsp;method&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PostMethod(url);<br />
</span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">下面的就是将要提交的表单的数据填入PostMethod对象里面，以name&nbsp;,&nbsp;value&nbsp;对加入！</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method.addParameter(</span><span style="color: #000000;">"</span><span style="color: #000000;">HPNation</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">086</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method.addParameter(</span><span style="color: #000000;">"</span><span style="color: #000000;">HPCity</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">020</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method.addParameter(</span><span style="color: #000000;">"</span><span style="color: #000000;">HPNumber</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">88888888</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method.addParameter(</span><span style="color: #000000;">"</span><span style="color: #000000;">FPNation</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">086</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method.addParameter(</span><span style="color: #000000;">"</span><span style="color: #000000;">FPCity</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">020</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method.addParameter(</span><span style="color: #000000;">"</span><span style="color: #000000;">FPNumber</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">88888888</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method.addParameter(</span><span style="color: #000000;">"</span><span style="color: #000000;">FPExtension</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">000</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">29</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method.addParameter(</span><span style="color: #000000;">"</span><span style="color: #000000;">MPNation</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">086</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method.addParameter(</span><span style="color: #000000;">"</span><span style="color: #000000;">Mobile</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">13888888888</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method.addParameter(</span><span style="color: #000000;">"</span><span style="color: #000000;">EmailAdd</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">888@888.com</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">32</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method.addParameter(</span><span style="color: #000000;">"</span><span style="color: #000000;">ReSumeID</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">88888888</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">33</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">34</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">这里是建立请求时服务器需要用到的Cookie。</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">35</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cookie&nbsp;cookie&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Cookie(</span><span style="color: #000000;">"</span><span style="color: #000000;">.51job.com</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">51job</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">ccry%3D.0%252FZKBaMTmj82%26%7C%26cconfirmkey%3DcpwWgp7FC9FZM%26%7C%26cresumeid%3D88888888%26%7C%26cresumeids88888888d888826%7C8408ilstatus%3D2%26%7C%26cnickname826cenglis8cautologin%3D</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">/</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #0000ff;">null</span><span style="color: #000000;">,</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">36</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">37</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">将设置好的Cookie加入模拟的客户端里。当请求发生时，就会将Cookie写进请求头里了</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">38</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client.getState().addCookie(cookie);<br />
</span><span style="color: #008080;">39</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">40</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">41</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">开始死循环</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">42</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">){<br />
</span><span style="color: #008080;">43</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">{<br />
</span><span style="color: #008080;">44</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">这里是要求客户端发送一个请求。直接将PostMethod请求出去。</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">45</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client.executeMethod(method);<br />
</span><span style="color: #008080;">46</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">47</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">下面是获取返回的结果</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">48</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;in&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;method.getResponseBodyAsStream();<br />
</span><span style="color: #008080;">49</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteArrayOutputStream&nbsp;baos&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ByteArrayOutputStream();<br />
</span><span style="color: #008080;">50</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">byte</span><span style="color: #000000;">[]&nbsp;buff&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">byte</span><span style="color: #000000;">[</span><span style="color: #000000;">1024</span><span style="color: #000000;">];<br />
</span><span style="color: #008080;">51</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;len&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">52</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">((len</span><span style="color: #000000;">=</span><span style="color: #000000;">in.read(buff))</span><span style="color: #000000;">!=-</span><span style="color: #000000;">1</span><span style="color: #000000;">){<br />
</span><span style="color: #008080;">53</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;baos.write(buff,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;len);<br />
</span><span style="color: #008080;">54</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">55</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;String(baos.toByteArray());<br />
</span><span style="color: #008080;">56</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">57</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">释放资源</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">58</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in.close();<br />
</span><span style="color: #008080;">59</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;baos.close();<br />
</span><span style="color: #008080;">60</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">61</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">在51job里，刷新简历成功的话，会返回一些JavaScript代码，里面有个alert()输出&#8220;简历已刷新&#8221;的信息的，你分析结果，如果有这句话，则成功刷新了。之后就让线程睡眠1分钟后循环刷新！</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">62</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(result.indexOf(</span><span style="color: #000000;">"</span><span style="color: #000000;">简历已刷新</span><span style="color: #000000;">"</span><span style="color: #000000;">)</span><span style="color: #000000;">!=-</span><span style="color: #000000;">1</span><span style="color: #000000;">){<br />
</span><span style="color: #008080;">63</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">简历已刷新！&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">i);<br />
</span><span style="color: #008080;">64</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff;">else</span><span style="color: #000000;">{<br />
</span><span style="color: #008080;">65</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">刷新失败！</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">66</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">67</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span style="color: #000000;">60000</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">68</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(Exception&nbsp;ex){<br />
</span><span style="color: #008080;">69</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">********&nbsp;Error!&nbsp;********</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">70</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">{<br />
</span><span style="color: #008080;">71</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">出现错误时，再等待20秒后再重新进行刷新。</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">72</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span style="color: #000000;">20000</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">73</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(Exception&nbsp;e){<br />
</span><span style="color: #008080;">74</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">********&nbsp;Thread&nbsp;Error!&nbsp;********</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">75</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">76</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">77</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">78</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">79</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">80</span>&nbsp;<span style="color: #000000;">}</span></div>
<br />
<br />
我们再来看看，其实很简单，我们来说明一下。HttpClient将很多Http协议底层的东西都封装了，这样很方便使用，如果自已用Socket写的话，还有处理很多信息，Http协议的三次握手等等的操作，很是麻烦。现在用HttpClient就一步到位了。但要注意一下，51job里面的简历刷新是要先登录后才可以进行的，而熟悉Web开发的人员都知道，登录后服务器就会记录下你的Session，而Session也是基于Cookie的，所以Session ID是以Cookie的方式记录在客户机的，这样每次请求都要将该Cookie发送到服务器验证，这样才可以保证Web的状态。所以，你可以在浏览器里先登录一次。之后找出该网站的Cookie文件，将里面的内容复制出来放上上面代码的Cookie类里面。你也可以用这个HttpClient写一个登录的请求，之后再从ResponseHeader里获取Cookie。至于表单里的信息，就按自已需要填写就行了。就是模拟一个浏览器，将你的简历刷新的表单模拟出来再发送。<br />
<br />
在下面，我给出一本电子书给大家下载参考：《Jakarta Commons Cookbook.chm》<br />
[down=attachments/month_0803/020083401424.chm]点击下载此文件[/down]<br />
<br />
<br />
<img src ="http://www.blogjava.net/cph8066/aggbug/218363.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cph8066/" target="_blank">姜大叔</a> 2008-07-29 13:09 <a href="http://www.blogjava.net/cph8066/archive/2008/07/29/218363.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>并发编程的重要性！</title><link>http://www.blogjava.net/cph8066/archive/2008/07/29/218362.html</link><dc:creator>姜大叔</dc:creator><author>姜大叔</author><pubDate>Tue, 29 Jul 2008 05:07:00 GMT</pubDate><guid>http://www.blogjava.net/cph8066/archive/2008/07/29/218362.html</guid><wfw:comment>http://www.blogjava.net/cph8066/comments/218362.html</wfw:comment><comments>http://www.blogjava.net/cph8066/archive/2008/07/29/218362.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cph8066/comments/commentRss/218362.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cph8066/services/trackbacks/218362.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在双核的CPU已经卖到白菜价了，四核也将在08年迎来普及风暴，这样看来，硬件处理性能是得到很大提高了，但是不是说明程序的效率就可以忽视了呢？肯定不是，程序也将配合硬件的提高，开发出更有效率，更强大，更好的人工智能的程序。多核的趋势，这不得不提到程序的并发性能，不然的话，100核的CPU也只会英雄无用武之地。如何更大地发挥多核CPU的性能，就要用到软件的并发处理能力了。但要设计得合理的并发程序也不是这么简单的事情，线程的控制也是很头痛的问题，还有安全问题等等，我越来越感觉到并发的重要性，所以这段时间也在找Java并发，线程方面的资料，打算钻研一番，并在几天后整理一下，将一些心得放上来。将会是Java并发优化方面的文章！另外，好像听说Flash Player 10将会支持线程，不知道是不是真的，看现时的AS3里没有线程的概念，将会出AS4与之配合？不管怎么都好，期待是美好的事情！<br />
<img src ="http://www.blogjava.net/cph8066/aggbug/218362.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cph8066/" target="_blank">姜大叔</a> 2008-07-29 13:07 <a href="http://www.blogjava.net/cph8066/archive/2008/07/29/218362.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>配置你的SVN服务器！</title><link>http://www.blogjava.net/cph8066/archive/2008/07/29/218361.html</link><dc:creator>姜大叔</dc:creator><author>姜大叔</author><pubDate>Tue, 29 Jul 2008 05:06:00 GMT</pubDate><guid>http://www.blogjava.net/cph8066/archive/2008/07/29/218361.html</guid><wfw:comment>http://www.blogjava.net/cph8066/comments/218361.html</wfw:comment><comments>http://www.blogjava.net/cph8066/archive/2008/07/29/218361.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cph8066/comments/commentRss/218361.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cph8066/services/trackbacks/218361.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SVN的好处，不用多说了，当你的项目做到一定规模时，多人开发甚至异地多人协作开发时，可以为你的团队省去很多麻烦。可能很多人都用过SVN的客户端工具，如TortoiseSVN或者是Eclipse中的插件，网上有很多开源项目，或者很多源代码，都会用这种方式发布，稍有关注一下技术的很多时候都会下载别人的源程序结合自已的项目开发或者是学习，比如去Google Code有很多。我们只用客户端去连接SVN的服务器，之后更新代码副本到本地。但我们也应该要认识一下SVN的服务器端，比如你是个项目的负责人建立一个项目让大家协同开发等，就要在你的机子上打开SVN服务器程序放上你的项目，让其它人用客户端去连接获取或更新代码。<br />
<br />
配置SVN服务器所需要的准备工具：<br />
SubVersion&nbsp; 可从&nbsp;<a title="http://subversion.tigris.org" href="http://subversion.tigris.org">http://subversion.tigris.org</a> 下载。这里就是SVN服务器的程序<br />
SVNService.exe&nbsp; （非必要）这个是将你的SVN服务端程序注册成Windows系统服务的，就好比是Tomcat，当你系统启动时，该SVN服务器会自动启动并后台运行，不注册成服务的话，就要自已手动打开了。<br />
<br />
现在工具都准备好了，动工。<br />
下载好SubVersion后，就进行安装，如果你下载的是ZIP包，那就解压到自定的目录就可以使用了。<br />
1.&nbsp; 打开CMD命令行模式，进入到SubVersion目录下的bin目录下，输入如下命令：<br />
<br />
svnadmin create d:\svn_projects\project1&nbsp;&nbsp; （路径可自定）<br />
<br />
如图：<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/cph8066/l20071027183930.jpg" width="596" height="56" /><br />
<br />
注：要先在D盘中建立 svn_projects目录 目录名称可以自已定，<br />
之后打开该目录，你可以看到，SVN帮你建立了一个project1的目录，里面生成了几个方件夹与文件，先不理它<br />
<br />
现在，存放项目的路径建好了，下面我们要来配置一下该项目的用户，密码等信息<br />
来打开project1/conf/文件夹下的svnserve.conf文件，以记事本打开就行了，你将会看到很多注释（都是采用Unix风格的 # 注释）将<br />
# anon-access = read<br />
# auth-access = write<br />
# password-db = passwd<br />
# realm = My First Repository<br />
这几句的的注释符号去掉找去掉前面的空格如下：<br />
anon-access = read<br />
auth-access = write<br />
password-db = passwd<br />
realm = My First Repository<br />
<br />
之后打开passwd文件，以记事本打开，在 [users] 下面添加你的用户名与密码<br />
比如我要添加一个 jiang 用户，密码是 123456 那么这样写<br />
jiang = 123456<br />
保存后就OK了，那么现在，可以运行SVN服务器程序了。<br />
在Cmd命令行下进入到SubVersion目录下的bin目录下，输入如下命令：<br />
<br />
svnserve -d -r d:\svn_projects<br />
<br />
如图所示：<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/cph8066/b2007102718558.jpg" width="521" height="49" /><br />
<br />
这样服务器就启动了，它会一直侦听的，所以不要关闭窗口。像Tomcat一样一直挂着就行，如果你觉得这样麻烦，就可以用SVNService.exe这个工具来注册成系统后台服务运行。<br />
<br />
注意：你现在的项目的SVN地址就是：svn://localhost/project1&nbsp; 内网就更换你的内网IP就行了，公网也换为你的公网IP就行了<br />
<br />
现在服务器就启动了，之后你可以用Eclipse的svn工具等将项目文件放到该SVN服务里共享，<br />
如下图所示：<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/cph8066/n200710271929.jpg" width="475" height="678" /><br />
<br />
就这样，SVN的服务器端就搭建好了，现在大家可以用SVN客户端更新下载下来开发了。<br />
<br />
关于其它SVN客户工具的登录，可以参考以下文章<br />
<a title="如何结合使用Subversion和Eclipse" href="http://www.ibm.com/developerworks/cn/opensource/os-ecl-subversion/index.html">如何结合使用Subversion和Eclipse</a><br />
<br />
<img src ="http://www.blogjava.net/cph8066/aggbug/218361.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cph8066/" target="_blank">姜大叔</a> 2008-07-29 13:06 <a href="http://www.blogjava.net/cph8066/archive/2008/07/29/218361.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java反射机制</title><link>http://www.blogjava.net/cph8066/archive/2008/07/29/218358.html</link><dc:creator>姜大叔</dc:creator><author>姜大叔</author><pubDate>Tue, 29 Jul 2008 05:00:00 GMT</pubDate><guid>http://www.blogjava.net/cph8066/archive/2008/07/29/218358.html</guid><wfw:comment>http://www.blogjava.net/cph8066/comments/218358.html</wfw:comment><comments>http://www.blogjava.net/cph8066/archive/2008/07/29/218358.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cph8066/comments/commentRss/218358.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cph8066/services/trackbacks/218358.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Java运行时环境中，对于任意一个类，能否知道这个类有哪些属性和方法？对于任意一个对象，能否调用它的任意一个方法？答案是肯定的。这种动态获取类的信息，以及动态调用对象的方法的功能来自于Java语言的反射（Reflection）机制。Java反射机制主要提供以下功能：<br />
<br />
[*]在运行时判断任意一个对象所属的类；<br />
[*]在运行时构造任意一个类的对象；<br />
[*]在运行时判断任意一个类所具有的成员变量和方法；<br />
[*]在运行时调用任意一个类的方法；<br />
[*]生成动态代理；<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在JDK中，主要由以下类来实现Java反射机制，这些类都位于 java.lang.reflect 包中。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [*] Class 类：代表一个类。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [*] Field 类：代表类的成员变量<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [*] Method 类：代表类的方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [*] Constructor 类：代表类的构造方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [*] Array 类：提供了动态创建数组，以及访问数组元素的静态方法<br />
<br />
<br />
看看下面例子：它读取命令行参数指定的类名，然后打印这个类的所具有的方法信息：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.lang.reflect.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;DumpMethods{<br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)thorws&nbsp;Exception{<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">加载并初始化命令行参数指定的类</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;classType&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Class.forName(args[</span><span style="color: #000000;">0</span><span style="color: #000000;">]);<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">获得类的所有方法</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method[]&nbsp;methods&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;classType.getDeclaredMethods();<br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">methods.length;i</span><span style="color: #000000;">++</span><span style="color: #000000;">){<br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(methods[i].toString());<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">}</span></div>
<br />
<br />
运行命令 &#8220;java DumpMethods java.util.Stack&#8221;，就会显示java.util.Stack 类所具有的方法。<br />
<br />
这个只是十分之基本，很简单的示例，Java的反射还可以做很多东西，可以跟据用户的输入就可以得知哪些类，需要做什么操作，就是说动态跟据需要来调用相应的类与相应的方法，我之前也做过，用Struts结合Java反射来实现一些功能，有些时候，别人的接口代码里只返回一个Object给你，而你就要用反射来得知该Object是属于哪一个类型，之后根据设置做相应的操作，不知道大家有用过Hibernate没有，这个框架就是大量用到了Java反射，用户只需配置一下XML文件，Hibernate运行时，就会读取解析XML配置文件，之后动态找相应的类，实例化相应的POJO等等，这些都是全动态化的，也就是说，我请求这个表的数据时，就自动实例化该表的POJO实例，这些都是在XML配置文件里定义好映射关系。ORM框架就如此，很多中间件也是大量使用反射，将反射灵活的运用起来，将会得到意想不到的效果，这也是Java的半动态语言吧。使编程工作变得十分灵活。<br />
<img src ="http://www.blogjava.net/cph8066/aggbug/218358.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cph8066/" target="_blank">姜大叔</a> 2008-07-29 13:00 <a href="http://www.blogjava.net/cph8066/archive/2008/07/29/218358.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java制作密码输入小键盘</title><link>http://www.blogjava.net/cph8066/archive/2008/07/29/218351.html</link><dc:creator>姜大叔</dc:creator><author>姜大叔</author><pubDate>Tue, 29 Jul 2008 04:47:00 GMT</pubDate><guid>http://www.blogjava.net/cph8066/archive/2008/07/29/218351.html</guid><wfw:comment>http://www.blogjava.net/cph8066/comments/218351.html</wfw:comment><comments>http://www.blogjava.net/cph8066/archive/2008/07/29/218351.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cph8066/comments/commentRss/218351.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cph8066/services/trackbacks/218351.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp; 不知道大家有没有用过农业银行的网上银行服务，该网上银行登录时，输入密码时，不可以直接打键盘输入，要用鼠标点击图形小键盘来输入，而小键盘里面的数字是随机排列的。&nbsp;&nbsp;&nbsp; 这样一来，可以防止木马记录用户键盘输入的密码被盗，确实是挻实用的功能，研究了一翻后，也大根掌握了它的工作原理，现在用Java来实现，大概是这样的：用Strut...&nbsp;&nbsp;<a href='http://www.blogjava.net/cph8066/archive/2008/07/29/218351.html'>阅读全文</a><img src ="http://www.blogjava.net/cph8066/aggbug/218351.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cph8066/" target="_blank">姜大叔</a> 2008-07-29 12:47 <a href="http://www.blogjava.net/cph8066/archive/2008/07/29/218351.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JspSmartUpload 中文问题！</title><link>http://www.blogjava.net/cph8066/archive/2008/07/29/218350.html</link><dc:creator>姜大叔</dc:creator><author>姜大叔</author><pubDate>Tue, 29 Jul 2008 04:37:00 GMT</pubDate><guid>http://www.blogjava.net/cph8066/archive/2008/07/29/218350.html</guid><wfw:comment>http://www.blogjava.net/cph8066/comments/218350.html</wfw:comment><comments>http://www.blogjava.net/cph8066/archive/2008/07/29/218350.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cph8066/comments/commentRss/218350.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cph8066/services/trackbacks/218350.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:     上几天，要做Jsp文件上传，上网Google了几下，发现多是用JspSmartUpload组件来实现上传，于是想将其应用到我的Struts应用里头，刚开始不太会用，随便写了个表单页面，就一个文件表单域，上传，OK，正确接收，但当应用到自已的项目里时，发现其它表单的信息出现乱码了，中文问题又出来了。<br>    但是确定是加上了这句：enctype="multipart/form-data"，还是不行，文件是可以正确获取了，只是其它的Text Input表单传来的中文怎么转换编码都不行，不能正确还原中文，我用的是UTF-8编码。我想，这应该是JspSmartUpload的问题吧，上网找了找，很多都没说过这问题，有很多文章都是说教你怎么用JspSmartUpload上传文件等等的，但那些例子都是只上传一个文件表单，没有混合上传与普通表单的信息。<br>    郁闷了半天，既然是组件的问题，我想到想看看修改它的源码来实现中文混合表单上传，我下载下来的都是Jar包的，都是已编译好的，又没时间上网找源码了，只好反编译一下，修改，再重新编译。唉，编译下来的类里面的变量名等等都很混乱，&nbsp;&nbsp;<a href='http://www.blogjava.net/cph8066/archive/2008/07/29/218350.html'>阅读全文</a><img src ="http://www.blogjava.net/cph8066/aggbug/218350.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cph8066/" target="_blank">姜大叔</a> 2008-07-29 12:37 <a href="http://www.blogjava.net/cph8066/archive/2008/07/29/218350.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>