<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Voland.com.cn &#187; Java</title>
	<atom:link href="http://www.voland.com.cn/tag/java/feed" rel="self" type="application/rss+xml" />
	<link>http://www.voland.com.cn</link>
	<description>人生百年,诸事记之</description>
	<lastBuildDate>Thu, 02 Feb 2012 23:09:02 +0000</lastBuildDate>
	<language>zh</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>北京十六方数据科技有限公司招聘java开发人员 年薪10W~15W</title>
		<link>http://www.voland.com.cn/16-party-data-technology-co-ltd-in-beijing-to-recruit-java-developer-salary-10w-15w</link>
		<comments>http://www.voland.com.cn/16-party-data-technology-co-ltd-in-beijing-to-recruit-java-developer-salary-10w-15w#comments</comments>
		<pubDate>Thu, 02 Feb 2012 23:08:26 +0000</pubDate>
		<dc:creator>Nortan</dc:creator>
				<category><![CDATA[一起分享]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.voland.com.cn/?p=738</guid>
		<description><![CDATA[公司研发新产品,需要招聘两名java开发人员,公司以前从不加班,但目前公司研发新产品,在产品研发关键时候可能偶尔会有加班,加班一般安排在周末,占用一天时间,大家如有能力有兴趣,请发邮件到job1@16ds.com,这个招聘邮箱为研发部门专用 职位要求分别如下: 职位一:Java Swing 开发工程师 学 历： 大专及以上 招聘人数： 1 人 年薪:10W~15W 任职条件： 有2年及以上Java开发经验； 熟练掌握swing,有实际的swing C/S程序开发经验。对j2ee开发有一定经验 思维活跃、心思缜密，考虑问题全面，具备较强的钻研精神及学习能力； 具备良好的团队合作精神、性格开朗，优秀的语言表达能力； 有android开发经验者优先考虑。 工作职责： 按美工设计完成产品UI的实现(使用Swing) 理解产品需求，能够完成模块的详细设计及实现、编写相关的技术文档； 进行编码和单元测试、bug定位和修复，并根据要求修改、完善产品。 职位二:j2ee开发工程师 学 历： 大专及以上 招聘人数： 1 人 年薪:6W~12W 任职条件： 有1年及以上Java开发经验,对j2ee熟练掌握； 熟悉HTML、CSS,javascript的开发知识，熟悉jquery等JS框架为佳； 熟悉MYSQL,需要一定的SQL编写能力 思维活跃、心思缜密，考虑问题全面，具备较强的钻研精神及学习能力； 具备良好的团队合作精神、性格开朗，优秀的语言表达能力； 工作职责： 按美工设计完成产品WEB页面的实现(html,jquery,css) 理解产品需求，能够完成模块的详细设计及实现、编写相关的技术文档； 进行编码和单元测试、bug定位和修复，并根据要求修改、完善产品。]]></description>
			<content:encoded><![CDATA[<p>公司研发新产品,需要招聘两名java开发人员,公司以前从不加班,但目前公司研发新产品,在产品研发关键时候可能偶尔会有加班,加班一般安排在周末,占用一天时间,大家如有能力有兴趣,请发邮件到job1@16ds.com,这个招聘邮箱为研发部门专用<br />
职位要求分别如下: <span id="more-738"></span></p>
<p>职位一:Java Swing 开发工程师<br />
学    历： 大专及以上<br />
招聘人数： 1 人<br />
年薪:10W~15W </p>
<p>任职条件：<br />
    有2年及以上Java开发经验；<br />
    熟练掌握swing,有实际的swing C/S程序开发经验。对j2ee开发有一定经验<br />
    思维活跃、心思缜密，考虑问题全面，具备较强的钻研精神及学习能力；<br />
    具备良好的团队合作精神、性格开朗，优秀的语言表达能力；<br />
    有android开发经验者优先考虑。 </p>
<p>工作职责：<br />
    按美工设计完成产品UI的实现(使用Swing)<br />
    理解产品需求，能够完成模块的详细设计及实现、编写相关的技术文档；<br />
    进行编码和单元测试、bug定位和修复，并根据要求修改、完善产品。 </p>
<p>职位二:j2ee开发工程师<br />
学    历： 大专及以上<br />
招聘人数： 1 人<br />
年薪:6W~12W </p>
<p>任职条件：<br />
    有1年及以上Java开发经验,对j2ee熟练掌握；<br />
    熟悉HTML、CSS,javascript的开发知识，熟悉jquery等JS框架为佳；<br />
    熟悉MYSQL,需要一定的SQL编写能力<br />
    思维活跃、心思缜密，考虑问题全面，具备较强的钻研精神及学习能力；<br />
    具备良好的团队合作精神、性格开朗，优秀的语言表达能力； </p>
<p>工作职责：<br />
    按美工设计完成产品WEB页面的实现(html,jquery,css)<br />
    理解产品需求，能够完成模块的详细设计及实现、编写相关的技术文档；<br />
    进行编码和单元测试、bug定位和修复，并根据要求修改、完善产品。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.voland.com.cn/16-party-data-technology-co-ltd-in-beijing-to-recruit-java-developer-salary-10w-15w/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C++调用JVM.DLL来启动java程序</title>
		<link>http://www.voland.com.cn/c-calling-java-program-to-start-jvm-dll</link>
		<comments>http://www.voland.com.cn/c-calling-java-program-to-start-jvm-dll#comments</comments>
		<pubDate>Fri, 02 Sep 2011 09:55:16 +0000</pubDate>
		<dc:creator>Nortan</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.voland.com.cn/?p=707</guid>
		<description><![CDATA[eclipse可以使用startup.jar来启动,但一般会用eclipse.exe来启动程序.这样系统进程也是eclipse.exe,而不是java.exe或者javaw.exe.这个eclipse.exe是使用C调用jvm.dll来启动java程序,最近的项目是基于Swing的java程序,所以也需要写一个exe来启动程序. 原来已经做了一个startup.exe,是使用NSIS来实现的,这里代码就不写出来了,因为他没有多在意义,原因有二: 第一,他在静默状态下执行,360安全卫士认为他是一个病毒,好像以前诺顿也误报过.这里BS一下360安全卫士 第二,他执行javaw来调用java程序,进程显示还是javaw,这样不好看.在进程里看到叫nortan.exe多好,呵呵 使用C++调用JVM.DLL来启动java程序,先来看看别人画的一个原理图: 从这个图上中可以看出,最主要还是怎么使用C++加载jvm.dll,然后把其一系列的操作.根据这个思路,写出如下代码: #include &#60;windows.h&#62; #include &#60;jni.h&#62; #include &#60;string&#62; using namespace std; &#160; void vShowError&#40;string sErrorMessage&#41;; void vShowLastError&#40;string sErrorMessage&#41;; void vDestroyVM&#40;JNIEnv *env, JavaVM *jvm&#41;; void vAddOption&#40;string&#38; sName&#41;; &#160; JavaVMOption* vm_options; int mctOptions = 0; int mctOptionCapacity = 0; boolean GetApplicationHome&#40;char *buf, jint sz&#41;; typedef jint &#40;CALLBACK *CreateJavaVM&#41;&#40;JavaVM **pvm, JNIEnv **penv, void *args&#41;; [...]]]></description>
			<content:encoded><![CDATA[<p>eclipse可以使用startup.jar来启动,但一般会用eclipse.exe来启动程序.这样系统进程也是eclipse.exe,而不是java.exe或者javaw.exe.这个eclipse.exe是使用C调用jvm.dll来启动java程序,最近的项目是基于Swing的java程序,所以也需要写一个exe来启动程序.<br />
原来已经做了一个startup.exe,是使用NSIS来实现的,这里代码就不写出来了,因为他没有多在意义,原因有二:<br />
第一,他在静默状态下执行,360安全卫士认为他是一个病毒,好像以前诺顿也误报过.这里BS一下360安全卫士<br />
第二,他执行javaw来调用java程序,进程显示还是javaw,这样不好看.在进程里看到叫nortan.exe多好,呵呵</p>
<p>使用C++调用JVM.DLL来启动java程序,先来看看别人画的一个原理图:<span id="more-707"></span><br />
<div id="attachment_708" class="wp-caption aligncenter" style="width: 324px"><img src="http://www.voland.com.cn/wp-content/uploads/2011/09/218717.gif" alt="java启动原理图" title="218717" width="314" height="308" class="size-full wp-image-708" /><p class="wp-caption-text">java启动原理图</p></div><br />
从这个图上中可以看出,最主要还是怎么使用C++加载jvm.dll,然后把其一系列的操作.根据这个思路,写出如下代码:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;windows.h&gt;</span>
<span style="color: #339933;">#include &lt;jni.h&gt;</span>
<span style="color: #339933;">#include &lt;string&gt;</span>
using namespace std<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">void</span> vShowError<span style="color: #009900;">&#40;</span><span style="color: #993333;">string</span> sErrorMessage<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> vShowLastError<span style="color: #009900;">&#40;</span><span style="color: #993333;">string</span> sErrorMessage<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> vDestroyVM<span style="color: #009900;">&#40;</span>JNIEnv <span style="color: #339933;">*</span>env<span style="color: #339933;">,</span> JavaVM <span style="color: #339933;">*</span>jvm<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> vAddOption<span style="color: #009900;">&#40;</span>string<span style="color: #339933;">&amp;</span> sName<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
JavaVMOption<span style="color: #339933;">*</span> vm_options<span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> mctOptions <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> mctOptionCapacity <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
boolean GetApplicationHome<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span>buf<span style="color: #339933;">,</span> jint sz<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">typedef</span> jint <span style="color: #009900;">&#40;</span>CALLBACK <span style="color: #339933;">*</span>CreateJavaVM<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>JavaVM <span style="color: #339933;">**</span>pvm<span style="color: #339933;">,</span> JNIEnv <span style="color: #339933;">**</span>penv<span style="color: #339933;">,</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>args<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">int</span> WINAPI WinMain<span style="color: #009900;">&#40;</span>HINSTANCE hInstance<span style="color: #339933;">,</span> HINSTANCE hPrevInstance<span style="color: #339933;">,</span> PSTR szCmdLine<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> iCmdShow<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    JNIEnv <span style="color: #339933;">*</span>env<span style="color: #339933;">;</span>
    JavaVM <span style="color: #339933;">*</span>jvm<span style="color: #339933;">;</span>
    jint jintVMStartupReturnValue<span style="color: #339933;">;</span>
    jclass jclassStartup<span style="color: #339933;">;</span>
    jmethodID midStartup<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// 确定各种文件所在的路径</span>
    <span style="color: #666666; font-style: italic;">// -应用的主目录</span>
    <span style="color: #993333;">char</span> home<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2000</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>GetApplicationHome<span style="color: #009900;">&#40;</span>home<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>home<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        vShowError<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;不能确定应用的主目录。&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #993333;">string</span> sAppHome<span style="color: #009900;">&#40;</span>home<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">string</span> sOption_AppHome <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;-Ddodo.home=&quot;</span> <span style="color: #339933;">+</span> sAppHome<span style="color: #339933;">;</span>
    <span style="color: #993333;">string</span> sJREPath <span style="color: #339933;">=</span> sAppHome <span style="color: #339933;">+</span> <span style="color: #ff0000;">&quot;\\jre&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// -VM路径</span>
    <span style="color: #993333;">string</span> sRuntimePath <span style="color: #339933;">=</span> sJREPath <span style="color: #339933;">+</span> <span style="color: #ff0000;">&quot;\<span style="color: #000099; font-weight: bold;">\b</span>in\\client&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">string</span> sJVMpath <span style="color: #339933;">=</span> sRuntimePath <span style="color: #339933;">+</span> <span style="color: #ff0000;">&quot;\\jvm.dll&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// -启动路径</span>
    <span style="color: #993333;">string</span> sBootPath <span style="color: #339933;">=</span> sJREPath <span style="color: #339933;">+</span> <span style="color: #ff0000;">&quot;\\lib&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">string</span> sOption_BootPath <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;-Dsun.boot.class.path=&quot;</span> <span style="color: #339933;">+</span> sBootPath<span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// -CLASSPATH</span>
	<span style="color: #993333;">string</span> sClassPath <span style="color: #339933;">=</span> sAppHome <span style="color: #339933;">+</span> <span style="color: #ff0000;">&quot;\\main\\startup.jar&quot;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #993333;">string</span> sOption_ClassPath <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;-Djava.class.path=&quot;</span> <span style="color: #339933;">+</span> sClassPath<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// 设置VM参数</span>
    <span style="color: #666666; font-style: italic;">// vAddOption(string(&quot;-verbose&quot;));</span>
    vAddOption<span style="color: #009900;">&#40;</span>sOption_ClassPath<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    vAddOption<span style="color: #009900;">&#40;</span>sOption_AppHome<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// VM初始化参数</span>
    JavaVMInitArgs vm_args<span style="color: #339933;">;</span>
    vm_args.<span style="color: #202020;">version</span> <span style="color: #339933;">=</span> <span style="color: #208080;">0x00010002</span><span style="color: #339933;">;</span>
    vm_args.<span style="color: #202020;">options</span> <span style="color: #339933;">=</span> vm_options<span style="color: #339933;">;</span>
    vm_args.<span style="color: #202020;">nOptions</span> <span style="color: #339933;">=</span> mctOptions<span style="color: #339933;">;</span>
    vm_args.<span style="color: #202020;">ignoreUnrecognized</span> <span style="color: #339933;">=</span> JNI_TRUE<span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// 装入JVM库</span>
    HINSTANCE hJVM <span style="color: #339933;">=</span> LoadLibrary<span style="color: #009900;">&#40;</span>sJVMpath.<span style="color: #202020;">c_str</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> hJVM <span style="color: #339933;">==</span> NULL <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        vShowLastError<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;不能从下面的路径装入JVM：&quot;</span> <span style="color: #339933;">+</span> sJVMpath<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #666666; font-style: italic;">// 启动1.2/3/4 VM</span>
    CreateJavaVM lpfnCreateJavaVM <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>CreateJavaVM<span style="color: #009900;">&#41;</span> GetProcAddress<span style="color: #009900;">&#40;</span>hJVM<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;JNI_CreateJavaVM&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    jintVMStartupReturnValue <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>lpfnCreateJavaVM<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>jvm<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>env<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>vm_args<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// 是否成功？</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>jintVMStartupReturnValue <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">string</span> sErrorMessage <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;创建VM失败。&quot;</span><span style="color: #339933;">;</span>
        vShowError<span style="color: #009900;">&#40;</span>sErrorMessage<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        vDestroyVM<span style="color: #009900;">&#40;</span>env<span style="color: #339933;">,</span> jvm<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #666666; font-style: italic;">// 要启动的类</span>
    <span style="color: #993333;">string</span> sStartupClass <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;DodoStartup&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// 注意句点符号已经被转换成斜杠</span>
    jclassStartup <span style="color: #339933;">=</span> env<span style="color: #339933;">-&gt;</span>FindClass<span style="color: #009900;">&#40;</span>sStartupClass.<span style="color: #202020;">c_str</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>jclassStartup <span style="color: #339933;">==</span> NULL<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">string</span> sErrorMessage <span style="color: #339933;">=</span><span style="color: #ff0000;">&quot;找不到启动类[&quot;</span> <span style="color: #339933;">+</span>sStartupClass <span style="color: #339933;">+</span> <span style="color: #ff0000;">&quot;]&quot;</span><span style="color: #339933;">;</span>
        vShowError<span style="color: #009900;">&#40;</span>sErrorMessage<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        vDestroyVM<span style="color: #009900;">&#40;</span>env<span style="color: #339933;">,</span> jvm<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #666666; font-style: italic;">// 要启动的方法</span>
    <span style="color: #993333;">string</span> sStartupMethod_Identifier <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;main&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">string</span> sStartupMethod_TypeDescriptor <span style="color: #339933;">=</span><span style="color: #ff0000;">&quot;([Ljava/lang/String;)V&quot;</span><span style="color: #339933;">;</span>
    midStartup <span style="color: #339933;">=</span> env<span style="color: #339933;">-&gt;</span>GetStaticMethodID<span style="color: #009900;">&#40;</span>jclassStartup<span style="color: #339933;">,</span>
    sStartupMethod_Identifier.<span style="color: #202020;">c_str</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    sStartupMethod_TypeDescriptor.<span style="color: #202020;">c_str</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>midStartup <span style="color: #339933;">==</span> NULL<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">string</span> sErrorMessage <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;找不到启动方法[&quot;</span><span style="color: #339933;">+</span> sStartupClass <span style="color: #339933;">+</span> <span style="color: #ff0000;">&quot;.&quot;</span><span style="color: #339933;">+</span> sStartupMethod_Identifier
        <span style="color: #339933;">+</span> <span style="color: #ff0000;">&quot;]，类型描述符是[&quot;</span> <span style="color: #339933;">+</span> sStartupMethod_TypeDescriptor <span style="color: #339933;">+</span> <span style="color: #ff0000;">&quot;]&quot;</span><span style="color: #339933;">;</span>
        vShowError<span style="color: #009900;">&#40;</span>sErrorMessage<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        vDestroyVM<span style="color: #009900;">&#40;</span>env<span style="color: #339933;">,</span> jvm<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #666666; font-style: italic;">// 构造启动方法的参数</span>
    jstring jstringExampleArg<span style="color: #339933;">;</span>
    jclass jclassString<span style="color: #339933;">;</span>
    jobjectArray jobjectArray_args<span style="color: #339933;">;</span>
    jstringExampleArg <span style="color: #339933;">=</span> env<span style="color: #339933;">-&gt;</span>NewStringUTF<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;string1&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>jstringExampleArg <span style="color: #339933;">==</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        vDestroyVM<span style="color: #009900;">&#40;</span>env<span style="color: #339933;">,</span> jvm<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    jclassString <span style="color: #339933;">=</span> env<span style="color: #339933;">-&gt;</span>FindClass<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;java/lang/String&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    jobjectArray_args <span style="color: #339933;">=</span> env<span style="color: #339933;">-&gt;</span>NewObjectArray<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> jclassString<span style="color: #339933;">,</span> jstringExampleArg<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>jobjectArray_args <span style="color: #339933;">==</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        vDestroyVM<span style="color: #009900;">&#40;</span>env<span style="color: #339933;">,</span> jvm<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #666666; font-style: italic;">// 调用启动方法启动Java程序</span>
    env<span style="color: #339933;">-&gt;</span>CallStaticVoidMethod<span style="color: #009900;">&#40;</span>jclassStartup<span style="color: #339933;">,</span> midStartup<span style="color: #339933;">,</span> jobjectArray_args<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// 在退出之前尝试分离主线程</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>jvm<span style="color: #339933;">-&gt;</span>DetachCurrentThread<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        vShowError<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;分离主线程失败。<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #666666; font-style: italic;">// 只要还有非守护线程，下面的调用将一直被挂起</span>
    jvm<span style="color: #339933;">-&gt;</span>DestroyJavaVM<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #993333;">void</span> vDestroyVM<span style="color: #009900;">&#40;</span>JNIEnv <span style="color: #339933;">*</span>env<span style="color: #339933;">,</span> JavaVM <span style="color: #339933;">*</span>jvm<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>env<span style="color: #339933;">-&gt;</span>ExceptionOccurred<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        env<span style="color: #339933;">-&gt;</span>ExceptionDescribe<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    jvm<span style="color: #339933;">-&gt;</span>DestroyJavaVM<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> vShowError<span style="color: #009900;">&#40;</span><span style="color: #993333;">string</span> sError<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    MessageBox<span style="color: #009900;">&#40;</span>NULL<span style="color: #339933;">,</span> sError.<span style="color: #202020;">c_str</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;错误&quot;</span><span style="color: #339933;">,</span> MB_OK<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* 在对话框中显示错误信息，括号内包含
的GetLastError错误信息 */</span>
<span style="color: #993333;">void</span> vShowLastError<span style="color: #009900;">&#40;</span><span style="color: #993333;">string</span> sLocalError<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    LPVOID lpSystemMsgBuf<span style="color: #339933;">;</span>
    FormatMessage<span style="color: #009900;">&#40;</span> FORMAT_MESSAGE_ALLOCATE_BUFFER <span style="color: #339933;">|</span>
    FORMAT_MESSAGE_FROM_SYSTEM <span style="color: #339933;">|</span> FORMAT_MESSAGE_IGNORE_INSERTS<span style="color: #339933;">,</span>
    NULL<span style="color: #339933;">,</span> GetLastError<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> MAKELANGID<span style="color: #009900;">&#40;</span>LANG_NEUTRAL<span style="color: #339933;">,</span> SUBLANG_DEFAULT<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    <span style="color: #009900;">&#40;</span>LPTSTR<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span>lpSystemMsgBuf<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> NULL <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">string</span> sSystemError <span style="color: #339933;">=</span> <span style="color: #993333;">string</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>LPTSTR<span style="color: #009900;">&#41;</span>lpSystemMsgBuf<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    vShowError<span style="color: #009900;">&#40;</span>sLocalError <span style="color: #339933;">+</span> <span style="color: #ff0000;">&quot; [&quot;</span> <span style="color: #339933;">+</span> sSystemError <span style="color: #339933;">+</span> <span style="color: #ff0000;">&quot;]&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> vAddOption<span style="color: #009900;">&#40;</span>string<span style="color: #339933;">&amp;</span> sValue<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    mctOptions<span style="color: #339933;">++;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>mctOptions <span style="color: #339933;">&gt;=</span> mctOptionCapacity<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>mctOptionCapacity <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            mctOptionCapacity <span style="color: #339933;">=</span> <span style="color: #0000dd;">3</span><span style="color: #339933;">;</span>
            vm_options <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>JavaVMOption<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>malloc<span style="color: #009900;">&#40;</span>mctOptionCapacity <span style="color: #339933;">*</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>JavaVMOption<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
            JavaVMOption <span style="color: #339933;">*</span>tmp<span style="color: #339933;">;</span>
            mctOptionCapacity <span style="color: #339933;">*=</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>
            tmp <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>JavaVMOption<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>malloc<span style="color: #009900;">&#40;</span>mctOptionCapacity <span style="color: #339933;">*</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>JavaVMOption<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            memcpy<span style="color: #009900;">&#40;</span>tmp<span style="color: #339933;">,</span> vm_options<span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span>mctOptions<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>JavaVMOption<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            free<span style="color: #009900;">&#40;</span>vm_options<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            vm_options <span style="color: #339933;">=</span> tmp<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    vm_options<span style="color: #009900;">&#91;</span>mctOptions<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">optionString</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>sValue.<span style="color: #202020;">c_str</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* 如果缓冲区是&quot;c:\app\bin\java&quot;，则把&quot;c:\app&quot;放入buf。*/</span>
jboolean GetApplicationHome<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span>buf<span style="color: #339933;">,</span> jint sz<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>cp<span style="color: #339933;">;</span>
    GetModuleFileName<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> buf<span style="color: #339933;">,</span> sz<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #339933;">*</span>strrchr<span style="color: #009900;">&#40;</span>buf<span style="color: #339933;">,</span> <span style="color: #ff0000;">'\<span style="color: #000099; font-weight: bold;">\'</span>) = '</span>\<span style="color: #0000dd;">0</span><span style="color: #ff0000;">';
    if ((cp = strrchr(buf, '</span>\\<span style="color: #ff0000;">')) == 0) {
        // 如果应用程序放在驱动器的根目录下，且不存在bin目录
        // 会出现这种情形
        buf[0] = '</span>\<span style="color: #0000dd;">0</span><span style="color: #ff0000;">';
        return JNI_FALSE;
    }
    return JNI_TRUE;
}</span></pre></div></div>

<p>象大多数Windows程序一样，启动器需要一个WinMain()入口。与Windows这一特定平台相关的问题，除了必要的类型转换（例如对CreateJavaVM()的转换）之外，另外一个要注意的地方就是装入VM的DLL文件。装入DLL文件最可靠的办法是显式地调用LoadLibrary()。装入JVM之后，就可以利用内核调用GetProcAddress()获得CreateJavaVM()的函数指针，然后调用该指针启动VM。<br />
注意,这里的启动类是DodoStartup,这个类并没有包路径,如果是com.voland.DodoStartup,这个串可能就得写成”com/voland/DodoStartup”,因为FindClass()是一个虚拟机调用，而虚拟机内部用斜杠作为分隔符。</p>
<p>Java程序启动后执行的第一个方法称为启动方法，通常是main()。本例通过JNI调用GetStaticMethodID()获得启动方法的ID。GetStaticMethodID()要求指定方法的名字（“main”）和方法的类型描述符（“([Ljava/lang/String;)V”）。这个类型描述符表示方法的参数是一个字符串的数组，返回值类型是void。有关类型描述符的更详细的说明，请参见JVM相关资料。注意，从这里可以看出，在使用定制启动器时，Java程序的启动方法不必一定是static void的main方法，可以用任何方法作为Java程序中第一个执行的方法，甚至包括实例方法或构造函数。</p>
<p>示例程序中最后一个需要注意的地方是jvm->DestroyJavaVM()调用。从表面看起来，这个语句似乎是程序执行后进行清理工作的方法，可有可无。其实不然，如果Java程序是多线程的，在调用这个方法时程序仍旧在运行。例如，对于一个运行着的Swing程序，如果它的main方法结束，DestroyJavaVM()的执行将被阻塞，直至所有非守护线程都执行完毕，所以这行代码是必不可少的。如果省略这行代码，则当主线程执行完毕，即使其他线程（例如Swing GUI的事件循环）仍旧在运行，整个程序也会立即退出。</p>
<p>编译这个类需要用到jdk相关jni的c头文件,通过Visual C++ 6的菜单Tools→Options打开选项对话框。在Directories标签页下添加JDK的相关目录到Include和目录下。 如下图,注意你的jdk版本与路径的修改:<br />
<div id="attachment_709" class="wp-caption aligncenter" style="width: 556px"><img src="http://www.voland.com.cn/wp-content/uploads/2011/09/bd524fdb-4ad9-3074-bebf-4896bbfad938.jpg" alt="配置jni等头文件到开发环境中" title="bd524fdb-4ad9-3074-bebf-4896bbfad938" width="546" height="384" class="size-full wp-image-709" /><p class="wp-caption-text">配置jni等头文件到开发环境中</p></div></p>
]]></content:encoded>
			<wfw:commentRss>http://www.voland.com.cn/c-calling-java-program-to-start-jvm-dll/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用java实现Windows Explorer左边的常见任务</title>
		<link>http://www.voland.com.cn/windows-explorer-using-java-to-achieve-common-tasks-left</link>
		<comments>http://www.voland.com.cn/windows-explorer-using-java-to-achieve-common-tasks-left#comments</comments>
		<pubDate>Thu, 18 Aug 2011 02:40:04 +0000</pubDate>
		<dc:creator>Nortan</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[swing]]></category>

		<guid isPermaLink="false">http://www.voland.com.cn/?p=692</guid>
		<description><![CDATA[java实际可以做很多事情,只能你能想到的,理论上都可以实现出来,这文章介绍使用java实现Windows Explorer左边的常见任务.这文章原作者不是我,是WilliamChen,他写了很多美文章,我怕哪天他的文章都没有了,都删除了,所以把这些关键的图片,文字及代码存储起来.并在代码中保留原作者的名字.不做任何修改 下面的Enable Animation的JCheckBox可以设置是否使用动画效果。选择上折叠和展开就具有动画效果。 这个组件的类名是dyno.swing.beans.FolderPane。使用比较简单： FolderPane fp=new FolderPane&#40;&#41;;//设置是否有动画效果，缺省没有 fp.setAnimated&#40;true&#41;;//添加子面板 fp.addFolder&#40;&#34;文件和文件夹任务&#34;, getFileFolderPane&#40;&#41;&#41;; fp.addFolder&#40;&#34;其他位置&#34;, getOtherPlacePane&#40;&#41;&#41;; fp.addFolder&#40;&#34;详细信息&#34;, getDetailsPane&#40;&#41;&#41;; add&#40;fp, BorderLayout.CENTER&#41;; 主要接口有两个： //设置是否要动画效果 public void setAnimated&#40;boolean b&#41; //添加面板，title是面板标题文字，content是应用程序组件 public void addFolder&#40;String title, JComponent content&#41; 这个演示的源码可以从这儿下载，是一个NetBeans工程。编译之后，直接双击foldered_pane.jar既可观看效果。源代码中有详细的注解。]]></description>
			<content:encoded><![CDATA[<p>java实际可以做很多事情,只能你能想到的,理论上都可以实现出来,这文章介绍使用java实现Windows Explorer左边的常见任务.这文章原作者不是我,是WilliamChen,他写了很多美文章,我怕哪天他的文章都没有了,都删除了,所以把这些关键的图片,文字及代码存储起来.并在代码中保留原作者的名字.不做任何修改<br />
<img src="http://www.voland.com.cn/wp-content/uploads/2011/08/4b6047bcbcb26eedce10b.png" alt="" title="4b6047bcbcb26eedce10b" width="238" height="314" class="aligncenter size-full wp-image-693" /><br />
下面的Enable Animation的JCheckBox可以设置是否使用动画效果。选择上折叠和展开就具有动画效果。<br />
这个组件的类名是dyno.swing.beans.FolderPane。使用比较简单： <span id="more-692"></span></p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">    FolderPane fp<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> FolderPane<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//设置是否有动画效果，缺省没有</span>
    fp.<span style="color: #006633;">setAnimated</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//添加子面板      </span>
    fp.<span style="color: #006633;">addFolder</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;文件和文件夹任务&quot;</span>, getFileFolderPane<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>      
    fp.<span style="color: #006633;">addFolder</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;其他位置&quot;</span>, getOtherPlacePane<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>      
    fp.<span style="color: #006633;">addFolder</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;详细信息&quot;</span>, getDetailsPane<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>      
    add<span style="color: #009900;">&#40;</span>fp, <span style="color: #003399;">BorderLayout</span>.<span style="color: #006633;">CENTER</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>主要接口有两个：</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">    <span style="color: #666666; font-style: italic;">//设置是否要动画效果      </span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setAnimated<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">boolean</span> b<span style="color: #009900;">&#41;</span>
    <span style="color: #666666; font-style: italic;">//添加面板，title是面板标题文字，content是应用程序组件</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> addFolder<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> title, <span style="color: #003399;">JComponent</span> content<span style="color: #009900;">&#41;</span></pre></div></div>

<p>这个演示的源码可以从<a href="/wp-content/uploads/foldered_pane.zip">这儿</a>下载，是一个NetBeans工程。编译之后，直接双击foldered_pane.jar既可观看效果。源代码中有详细的注解。 </p>
]]></content:encoded>
			<wfw:commentRss>http://www.voland.com.cn/windows-explorer-using-java-to-achieve-common-tasks-left/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Swing中美化右键菜单JPopupMenu</title>
		<link>http://www.voland.com.cn/swing-in-the-landscaping-right-click-menu-jpopupmenu</link>
		<comments>http://www.voland.com.cn/swing-in-the-landscaping-right-click-menu-jpopupmenu#comments</comments>
		<pubDate>Thu, 28 Jul 2011 03:37:21 +0000</pubDate>
		<dc:creator>Nortan</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[swing]]></category>

		<guid isPermaLink="false">http://www.voland.com.cn/?p=662</guid>
		<description><![CDATA[先看看效果图: 我们首先从Swing的JPopupMenu组件进行扩展，让其接受一个图片，显示在左侧；或者接受一个字符串，动态生成图片后，在显示在左侧。为了避免准备图片的麻烦，我们就以动态生成内存图片为例，编写一个JImagedPopupMenu类。 JImagedPopupMenu在创建时可以接受一个字符串，生成一副内存图片BufferedImage。然后，我们需要覆盖 JComponent的getInsets方法，重新计算Inset的left值，将其在原数值基础上加上图片的宽度，然后返回： public Insets getInsets&#40;&#41; &#123; Insets insets = &#40;Insets&#41;super.getInsets&#40;&#41;.clone&#40;&#41;; insets.left += imageIcon.getIconWidth&#40;&#41;; return insets; &#125; 最后，覆盖paint方法，在原基础上增加图片的绘制： public void paint&#40;Graphics g&#41; &#123; super.paint&#40;g&#41;; if &#40;imageIcon != null&#41; &#123; Insets insets = getInsets&#40;&#41;; // 每一副图像的位置坐标 int x = insets.left - imageIcon.getIconWidth&#40;&#41;; int y = insets.top-2; &#160; Image image = imageIcon.getImage&#40;&#41;; // 平铺背景图片 while &#40;true&#41; [...]]]></description>
			<content:encoded><![CDATA[<p>先看看效果图:</p>
<div id="attachment_663" class="wp-caption aligncenter" style="width: 355px"><a href="http://www.voland.com.cn/wp-content/uploads/2011/07/未命名.jpg"><img class="size-full wp-image-663 " title="右键菜单" src="http://www.voland.com.cn/wp-content/uploads/2011/07/未命名.jpg" alt="右键菜单" width="345" height="214" /></a><p class="wp-caption-text">右键菜单</p></div>
<p>我们首先从Swing的JPopupMenu组件进行扩展，让其接受一个图片，显示在左侧；或者接受一个字符串，动态生成图片后，在显示在左侧。为了避免准备图片的麻烦，我们就以动态生成内存图片为例，编写一个JImagedPopupMenu类。</p>
<p>JImagedPopupMenu在创建时可以接受一个字符串，生成一副内存图片BufferedImage。然后，我们需要覆盖 JComponent的getInsets方法，重新计算Inset的left值，将其在原数值基础上加上图片的宽度，然后返回：<span id="more-662"></span></p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"> <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Insets</span> getInsets<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003399;">Insets</span> insets <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Insets</span><span style="color: #009900;">&#41;</span><span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">getInsets</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">clone</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        insets.<span style="color: #006633;">left</span> <span style="color: #339933;">+=</span> imageIcon.<span style="color: #006633;">getIconWidth</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">return</span> insets<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span></pre></div></div>

<p>最后，覆盖paint方法，在原基础上增加图片的绘制：</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> paint<span style="color: #009900;">&#40;</span><span style="color: #003399;">Graphics</span> g<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">paint</span><span style="color: #009900;">&#40;</span>g<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>imageIcon <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #003399;">Insets</span> insets <span style="color: #339933;">=</span> getInsets<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #666666; font-style: italic;">// 每一副图像的位置坐标</span>
    		<span style="color: #000066; font-weight: bold;">int</span> x <span style="color: #339933;">=</span> insets.<span style="color: #006633;">left</span> <span style="color: #339933;">-</span> imageIcon.<span style="color: #006633;">getIconWidth</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    		<span style="color: #000066; font-weight: bold;">int</span> y <span style="color: #339933;">=</span> insets.<span style="color: #006633;">top</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span>
&nbsp;
    		<span style="color: #003399;">Image</span> image <span style="color: #339933;">=</span> imageIcon.<span style="color: #006633;">getImage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    		<span style="color: #666666; font-style: italic;">// 平铺背景图片</span>
    		<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    			<span style="color: #666666; font-style: italic;">// 绘制图片</span>
    			g.<span style="color: #006633;">drawImage</span><span style="color: #009900;">&#40;</span>image, x, y, <span style="color: #000000; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    			<span style="color: #666666; font-style: italic;">// 如果绘制完毕，退出循环</span>
    			<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> y <span style="color: #339933;">&gt;</span> getSize<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">height</span><span style="color: #009900;">&#41;</span>
    				<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
    			y <span style="color: #339933;">+=</span> imageIcon.<span style="color: #006633;">getIconHeight</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    		<span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span></pre></div></div>

<p>完整代码如下：</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.awt.BorderLayout</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.awt.Color</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.awt.Font</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.awt.FontMetrics</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.awt.GradientPaint</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.awt.Graphics</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.awt.Graphics2D</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.awt.Image</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.awt.Insets</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.awt.Toolkit</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.awt.event.MouseEvent</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.awt.geom.AffineTransform</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.awt.image.BufferedImage</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.swing.ImageIcon</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.swing.JFrame</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.swing.JLabel</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.swing.JMenuItem</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.swing.JPopupMenu</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> JImagedPopupMenu <span style="color: #000000; font-weight: bold;">extends</span> <span style="color: #003399;">JPopupMenu</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">Font</span> font <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Font</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Dialog&quot;</span>, <span style="color: #003399;">Font</span>.<span style="color: #006633;">BOLD</span>, <span style="color: #cc66cc;">13</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">ImageIcon</span> imageIcon <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> JImagedPopupMenu<span style="color: #009900;">&#40;</span><span style="color: #003399;">ImageIcon</span> imageIcon<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">imageIcon</span> <span style="color: #339933;">=</span> imageIcon<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> JImagedPopupMenu<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> text<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">imageIcon</span> <span style="color: #339933;">=</span> createImage<span style="color: #009900;">&#40;</span>text<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">ImageIcon</span> createImage<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> text<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    	<span style="color: #003399;">FontMetrics</span> fm <span style="color: #339933;">=</span> <span style="color: #003399;">Toolkit</span>.<span style="color: #006633;">getDefaultToolkit</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getFontMetrics</span><span style="color: #009900;">&#40;</span>font<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    	<span style="color: #000066; font-weight: bold;">int</span> height <span style="color: #339933;">=</span> fm.<span style="color: #006633;">stringWidth</span><span style="color: #009900;">&#40;</span>text<span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">20</span><span style="color: #339933;">;</span>
        <span style="color: #003399;">BufferedImage</span> bi <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BufferedImage</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">30</span>, height, <span style="color: #003399;">BufferedImage</span>.<span style="color: #006633;">TYPE_INT_ARGB</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #003399;">ImageIcon</span> image <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">ImageIcon</span><span style="color: #009900;">&#40;</span>bi<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #003399;">Graphics2D</span> g2d <span style="color: #339933;">=</span> bi.<span style="color: #006633;">createGraphics</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #003399;">GradientPaint</span> paint <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">GradientPaint</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #003399;">Color</span>.<span style="color: #006633;">YELLOW</span>, <span style="color: #cc66cc;">30</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #003399;">Color</span>.<span style="color: #006633;">RED</span>, <span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        g2d.<span style="color: #006633;">setPaint</span><span style="color: #009900;">&#40;</span>paint<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        g2d.<span style="color: #006633;">fillRect</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span>, bi.<span style="color: #006633;">getWidth</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, bi.<span style="color: #006633;">getHeight</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #003399;">AffineTransform</span> at <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">AffineTransform</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        at.<span style="color: #006633;">rotate</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">-</span><span style="color: #003399;">Math</span>.<span style="color: #006633;">PI</span> <span style="color: #339933;">/</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        g2d.<span style="color: #006633;">setTransform</span><span style="color: #009900;">&#40;</span>at<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        g2d.<span style="color: #006633;">setColor</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Color</span>.<span style="color: #006633;">white</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        g2d.<span style="color: #006633;">setFont</span><span style="color: #009900;">&#40;</span>font<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        g2d.<span style="color: #006633;">drawString</span><span style="color: #009900;">&#40;</span>text, <span style="color: #339933;">-</span>height<span style="color: #339933;">+</span><span style="color: #cc66cc;">10</span>, bi.<span style="color: #006633;">getWidth</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">/</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">return</span> image<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Insets</span> getInsets<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003399;">Insets</span> insets <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Insets</span><span style="color: #009900;">&#41;</span><span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">getInsets</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">clone</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        insets.<span style="color: #006633;">left</span> <span style="color: #339933;">+=</span> imageIcon.<span style="color: #006633;">getIconWidth</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">return</span> insets<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> paint<span style="color: #009900;">&#40;</span><span style="color: #003399;">Graphics</span> g<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">paint</span><span style="color: #009900;">&#40;</span>g<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>imageIcon <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #003399;">Insets</span> insets <span style="color: #339933;">=</span> getInsets<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #666666; font-style: italic;">// 每一副图像的位置坐标</span>
    		<span style="color: #000066; font-weight: bold;">int</span> x <span style="color: #339933;">=</span> insets.<span style="color: #006633;">left</span> <span style="color: #339933;">-</span> imageIcon.<span style="color: #006633;">getIconWidth</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    		<span style="color: #000066; font-weight: bold;">int</span> y <span style="color: #339933;">=</span> insets.<span style="color: #006633;">top</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span>
&nbsp;
    		<span style="color: #003399;">Image</span> image <span style="color: #339933;">=</span> imageIcon.<span style="color: #006633;">getImage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    		<span style="color: #666666; font-style: italic;">// 平铺背景图片</span>
    		<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    			<span style="color: #666666; font-style: italic;">// 绘制图片</span>
    			g.<span style="color: #006633;">drawImage</span><span style="color: #009900;">&#40;</span>image, x, y, <span style="color: #000000; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    			<span style="color: #666666; font-style: italic;">// 如果绘制完毕，退出循环</span>
    			<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> y <span style="color: #339933;">&gt;</span> getSize<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">height</span><span style="color: #009900;">&#41;</span>
    				<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
    			y <span style="color: #339933;">+=</span> imageIcon.<span style="color: #006633;">getIconHeight</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    		<span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">JFrame</span> frame <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">JFrame</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        frame.<span style="color: #006633;">setSize</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">600</span>, <span style="color: #cc66cc;">500</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        frame.<span style="color: #006633;">setTitle</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ImageMenu&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">final</span> JImagedPopupMenu menu <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> JImagedPopupMenu<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;www.voland.com.cn&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        menu.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">JMenuItem</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Winzip 8.0&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        menu.<span style="color: #006633;">addSeparator</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        menu.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">JMenuItem</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Programs&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        menu.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">JMenuItem</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Document&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        menu.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">JMenuItem</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Settings&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        menu.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">JMenuItem</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Search&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        menu.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">JMenuItem</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Help and Support&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        menu.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">JMenuItem</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Run...&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #003399;">JLabel</span> label <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">JLabel</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Right click me to show image popup menu.&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        label.<span style="color: #006633;">addMouseListener</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> java.<span style="color: #006633;">awt</span>.<span style="color: #006633;">event</span>.<span style="color: #003399;">MouseAdapter</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> mouseReleased<span style="color: #009900;">&#40;</span><span style="color: #003399;">MouseEvent</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>e.<span style="color: #006633;">isPopupTrigger</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    menu.<span style="color: #006633;">show</span><span style="color: #009900;">&#40;</span>frame, e.<span style="color: #006633;">getPoint</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">x</span>, e.<span style="color: #006633;">getPoint</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">y</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        frame.<span style="color: #006633;">getContentPane</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>label, <span style="color: #003399;">BorderLayout</span>.<span style="color: #006633;">CENTER</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        frame.<span style="color: #006633;">show</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.voland.com.cn/swing-in-the-landscaping-right-click-menu-jpopupmenu/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>java操作Windows进程</title>
		<link>http://www.voland.com.cn/java-operating-windows-processes</link>
		<comments>http://www.voland.com.cn/java-operating-windows-processes#comments</comments>
		<pubDate>Tue, 19 Jul 2011 04:04:13 +0000</pubDate>
		<dc:creator>Nortan</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[人生百味]]></category>
		<category><![CDATA[Windows进程]]></category>

		<guid isPermaLink="false">http://www.voland.com.cn/?p=642</guid>
		<description><![CDATA[本文章介绍了使用java操作windows进程,并给出了例子类,这个类完了了列出所有的进程,获取PID,获取进程占用内存,杀死指定PID的进程,杀死指定进程名的进程等等]]></description>
			<content:encoded><![CDATA[<p>java对平台的依赖性不太大,所以对系统的一些处理一直不太人性化,比如系统托盘到JDK6才支持,而对进程的处理,如Windows进程,虽然可以很好的操作,但用到这个功能并会的人可能不太多.这里写了一个用java对windows进程操作的例子.</p>
<p>这个类完了了列出所有的进程,杀死指定PID的进程,杀死指定进程名的进程等等,当然有getTaskList这个方法怎么取PID我相信你懂了,只要真正看懂这个类,估计一般需要都可以满足了.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.BufferedReader</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.IOException</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.InputStreamReader</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.Collection</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.Hashtable</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> JavaWindowsTaskManager <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 杀死一个进程
	 * @param task 进程号
	 *            
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> killTask<span style="color: #009900;">&#40;</span><span style="color: #003399;">Integer</span> pid<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">// 取得任务列表</span>
			Hashtable<span style="color: #339933;">&lt;</span>Integer, WindowsTask<span style="color: #339933;">&gt;</span> tasks <span style="color: #339933;">=</span> getTaskList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			WindowsTask task <span style="color: #339933;">=</span> tasks.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>pid<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>task <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #003399;">Runtime</span>.<span style="color: #006633;">getRuntime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">exec</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;tskill &quot;</span> <span style="color: #339933;">+</span> pid<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>			
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Exception</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 杀死指定名称的所有进程
	 * @param taskName
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> killTask<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> taskName<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">try</span><span style="color: #009900;">&#123;</span>
			Hashtable<span style="color: #339933;">&lt;</span>Integer, WindowsTask<span style="color: #339933;">&gt;</span> tasks <span style="color: #339933;">=</span> getTaskList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			Collection<span style="color: #339933;">&lt;</span>WindowsTask<span style="color: #339933;">&gt;</span> allTasks <span style="color: #339933;">=</span> tasks.<span style="color: #006633;">values</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span>WindowsTask task<span style="color: #339933;">:</span> allTasks<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>task.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span>taskName<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
					killTask<span style="color: #009900;">&#40;</span>task.<span style="color: #006633;">getPid</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span>
			<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #009900;">&#125;</span><span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Exception</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 返回当前机器的所有进程
	 * 
	 * @return
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> Hashtable<span style="color: #339933;">&lt;</span>Integer, WindowsTask<span style="color: #339933;">&gt;</span> getTaskList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		Hashtable<span style="color: #339933;">&lt;</span>Integer, WindowsTask<span style="color: #339933;">&gt;</span> tasks <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Hashtable<span style="color: #339933;">&lt;</span>Integer, WindowsTask<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #003399;">Process</span> process <span style="color: #339933;">=</span> <span style="color: #003399;">Runtime</span>.<span style="color: #006633;">getRuntime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">exec</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;taskList&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #003399;">InputStreamReader</span> in <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">InputStreamReader</span><span style="color: #009900;">&#40;</span>process
					.<span style="color: #006633;">getInputStream</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, <span style="color: #0000ff;">&quot;GBK&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #003399;">BufferedReader</span> reader <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BufferedReader</span><span style="color: #009900;">&#40;</span>in<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #003399;">String</span> taskInfo <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
			WindowsTask task <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
			<span style="color: #003399;">String</span> tmp <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>taskInfo <span style="color: #339933;">=</span> reader.<span style="color: #006633;">readLine</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>taskInfo.<span style="color: #006633;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">0</span>
						<span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>taskInfo.<span style="color: #006633;">contains</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Services&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> taskInfo
								.<span style="color: #006633;">contains</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Console&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
					<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>taskInfo<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					task <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> WindowsTask<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					tmp <span style="color: #339933;">=</span> taskInfo.<span style="color: #006633;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">26</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					task.<span style="color: #006633;">setName</span><span style="color: #009900;">&#40;</span>tmp.<span style="color: #006633;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					tmp <span style="color: #339933;">=</span> taskInfo.<span style="color: #006633;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">26</span>, <span style="color: #cc66cc;">35</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					task.<span style="color: #006633;">setPid</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Integer</span>.<span style="color: #006633;">valueOf</span><span style="color: #009900;">&#40;</span>tmp.<span style="color: #006633;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
					tmp <span style="color: #339933;">=</span> taskInfo.<span style="color: #006633;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">35</span>, <span style="color: #cc66cc;">52</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					task.<span style="color: #006633;">setSessionName</span><span style="color: #009900;">&#40;</span>tmp.<span style="color: #006633;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					tmp <span style="color: #339933;">=</span> taskInfo.<span style="color: #006633;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">52</span>, <span style="color: #cc66cc;">64</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					task.<span style="color: #006633;">setSessionId</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Integer</span>.<span style="color: #006633;">valueOf</span><span style="color: #009900;">&#40;</span>tmp.<span style="color: #006633;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					tmp <span style="color: #339933;">=</span> taskInfo.<span style="color: #006633;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">64</span>, taskInfo.<span style="color: #006633;">lastIndexOf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;K&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					tmp <span style="color: #339933;">=</span> tmp.<span style="color: #006633;">replaceAll</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;,&quot;</span>, <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					task.<span style="color: #006633;">setMem</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Long</span>.<span style="color: #006633;">valueOf</span><span style="color: #009900;">&#40;</span>tmp.<span style="color: #006633;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
					tasks.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span>task.<span style="color: #006633;">getPid</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, task<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Exception</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">return</span> tasks<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 启动一个进程,传入的值可以是服务名,也可以是可执行文件的全路径名
	 * 
	 * @param task
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> startTask<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> task<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #003399;">Runtime</span>.<span style="color: #006633;">getRuntime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">exec</span><span style="color: #009900;">&#40;</span>task<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">IOException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> WindowsTask <span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">// 映像名称</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> name<span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">// PID</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">Integer</span> pid<span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">// 会话名</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> sessionName<span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">// 会话编号</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">Integer</span> sessionId<span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">// 内存使用</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">long</span> mem<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> getName<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> name<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setName<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> name<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">name</span> <span style="color: #339933;">=</span> name<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Integer</span> getPid<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> pid<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setPid<span style="color: #009900;">&#40;</span><span style="color: #003399;">Integer</span> pid<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">pid</span> <span style="color: #339933;">=</span> pid<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> getSessionName<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> sessionName<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setSessionName<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> sessionName<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">sessionName</span> <span style="color: #339933;">=</span> sessionName<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Integer</span> getSessionId<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> sessionId<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setSessionId<span style="color: #009900;">&#40;</span><span style="color: #003399;">Integer</span> sessionId<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">sessionId</span> <span style="color: #339933;">=</span> sessionId<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">long</span> getMem<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> mem<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setMem<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">long</span> mem<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">mem</span> <span style="color: #339933;">=</span> mem<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.voland.com.cn/java-operating-windows-processes/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>高性能JavaBean属性复制工具BeanUtils的实现</title>
		<link>http://www.voland.com.cn/javabean-properties-to-achieve-high-performance-replication-tool-beanutils</link>
		<comments>http://www.voland.com.cn/javabean-properties-to-achieve-high-performance-replication-tool-beanutils#comments</comments>
		<pubDate>Sat, 25 Jun 2011 01:40:10 +0000</pubDate>
		<dc:creator>Nortan</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[BeanUtils]]></category>
		<category><![CDATA[javabean]]></category>

		<guid isPermaLink="false">http://www.voland.com.cn/?p=636</guid>
		<description><![CDATA[本文介绍了高性能的JavaBean属性复制工具BeanUtils的实现过程,并与Jakarta-Common-BeanUtils做出对比,它的特点是更轻量,更高效]]></description>
			<content:encoded><![CDATA[<p>JavaBean属性复制较好的工具有apache提供的Jakarta-Common-BeanUtils,不过他的性能不太近人意,我测试的一个JavaBean共有16个属性,使用Jakarta-Common-BeanUtils与直接使用get/set方法相比,差开800倍!如果是企业内部应用800倍的差别可能影响也没有多大,但如果你做是一个高性能的服务器800倍就是很大的问题.当然,Jakarta-Common-BeanUtils还有一个问题,就是你的项目中必须引入commons-beanutils-x.x.x.jar及等等相关的包,这个我很不喜欢!</p>
<p>不喜欢它,又想要它的功能,那就自己写一个简单的,这样还自主!当然实现这样的JavaBean属性复制工具,必须要满足两个要求才有意义,第一是比它要轻量,甚至一个类就要解决它,第二个性能一定要比它好,这是最关键的.</p>
<p>实现这样的JavaBean属性复制工具,肯定要乃至java的反射.<span id="more-636"></span>于是第一个版本就出来了:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> BeanUtils <span style="color: #009900;">&#123;</span>
	@SuppressWarnings<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;unchecked&quot;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #339933;">&lt;</span>T<span style="color: #339933;">&gt;</span> T copyProperties<span style="color: #009900;">&#40;</span>Class<span style="color: #339933;">&lt;</span>T<span style="color: #339933;">&gt;</span> beanClass,<span style="color: #003399;">Object</span> fromBean<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">Class</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> classes <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000000; font-weight: bold;">Class</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">Object</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> objects <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Object</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>			
			T bean <span style="color: #339933;">=</span> beanClass.<span style="color: #006633;">newInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">Class</span> formBeanClass <span style="color: #339933;">=</span> fromBean.<span style="color: #006633;">getClass</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>			
			<span style="color: #003399;">Method</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> beanMethods <span style="color: #339933;">=</span> beanClass.<span style="color: #006633;">getMethods</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>			
&nbsp;
			<span style="color: #003399;">String</span> methodName  <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
			<span style="color: #003399;">String</span> getMethodName <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">Class</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> paramsType <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">Class</span> paramType <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
			<span style="color: #666666; font-style: italic;">//这里为什么用method去循环,而不用fields去循环?呵呵,这个就是提升性能的一个点</span>
			<span style="color: #000000; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Method</span> method<span style="color: #339933;">:</span> beanMethods<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				methodName <span style="color: #339933;">=</span> method.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>				
				<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>methodName.<span style="color: #006633;">startsWith</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;set&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
					paramsType <span style="color: #339933;">=</span> method.<span style="color: #006633;">getParameterTypes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>paramsType.<span style="color: #006633;">length</span> <span style="color: #339933;">!=</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>
						<span style="color: #000000; font-weight: bold;">continue</span><span style="color: #339933;">;</span>
&nbsp;
					paramType <span style="color: #339933;">=</span> paramsType<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
					<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>paramType.<span style="color: #006633;">isInstance</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">boolean</span>.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
						getMethodName <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;is&quot;</span><span style="color: #339933;">+</span>methodName.<span style="color: #006633;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					<span style="color: #009900;">&#125;</span><span style="color: #000000; font-weight: bold;">else</span><span style="color: #009900;">&#123;</span>
						getMethodName <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;get&quot;</span><span style="color: #339933;">+</span>methodName.<span style="color: #006633;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					<span style="color: #009900;">&#125;</span>
&nbsp;
					<span style="color: #000000; font-weight: bold;">try</span><span style="color: #009900;">&#123;</span>
						<span style="color: #003399;">Method</span> formBeanGetMethod <span style="color: #339933;">=</span> formBeanClass.<span style="color: #006633;">getMethod</span><span style="color: #009900;">&#40;</span>getMethodName, classes<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
						<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> paramType.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span> formBeanGetMethod.<span style="color: #006633;">getReturnType</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
							<span style="color: #003399;">Object</span> value <span style="color: #339933;">=</span> formBeanGetMethod.<span style="color: #006633;">invoke</span><span style="color: #009900;">&#40;</span>fromBean,objects<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
							<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>value <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
								method.<span style="color: #006633;">invoke</span><span style="color: #009900;">&#40;</span>bean,<span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Object</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#123;</span>value<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
							<span style="color: #009900;">&#125;</span>
						<span style="color: #009900;">&#125;</span>
					<span style="color: #009900;">&#125;</span><span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">NoSuchMethodException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
				<span style="color: #009900;">&#125;</span>				
			<span style="color: #009900;">&#125;</span>		
			<span style="color: #000000; font-weight: bold;">return</span> bean<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Exception</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>		
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>代码没有写注释,请见谅,最近项目太紧,没有办法.这个工具只有一个类,实现了JavaBean属性复制,测试比Jakarta-Common-BeanUtils快一些,但与直接使用get/set方法相比还是相关600倍左右!在上面的代码中,有三个地方比较占用时间,而且无法自己控制,这三个地方是:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #003399;">Method</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> beanMethods <span style="color: #339933;">=</span> beanClass.<span style="color: #006633;">getMethods</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
paramsType <span style="color: #339933;">=</span> method.<span style="color: #006633;">getParameterTypes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003399;">Method</span> formBeanGetMethod <span style="color: #339933;">=</span> formBeanClass.<span style="color: #006633;">getMethod</span><span style="color: #009900;">&#40;</span>getMethodName, classes<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>对,反射!!都是反射的问题,这个没有办法解决,但反射的结果我们可以缓存起来,这样在高使用的情况下,获得高性能!请看第二个版本</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.lang.reflect.Method</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.HashMap</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> BeanUtils <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> HashMap<span style="color: #339933;">&lt;</span>Class, <span style="color: #003399;">Method</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">&gt;</span> beanMethodCache <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> HashMap<span style="color: #339933;">&lt;</span>Class, <span style="color: #003399;">Method</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> HashMap<span style="color: #339933;">&lt;</span>Class,HashMap<span style="color: #339933;">&lt;</span>String, Method<span style="color: #339933;">&gt;&gt;</span> fromBeanMethodCache <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> HashMap<span style="color: #339933;">&lt;</span>Class, HashMap<span style="color: #339933;">&lt;</span>String,Method<span style="color: #339933;">&gt;&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	@SuppressWarnings<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;unchecked&quot;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #339933;">&lt;</span>T<span style="color: #339933;">&gt;</span> T copyProperties<span style="color: #009900;">&#40;</span>Class<span style="color: #339933;">&lt;</span>T<span style="color: #339933;">&gt;</span> beanClass,<span style="color: #003399;">Object</span> fromBean<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">Class</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> classes <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000000; font-weight: bold;">Class</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">Object</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> objects <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Object</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>			
			T bean <span style="color: #339933;">=</span> beanClass.<span style="color: #006633;">newInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">Class</span> formBeanClass <span style="color: #339933;">=</span> fromBean.<span style="color: #006633;">getClass</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #003399;">Method</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> beanMethods <span style="color: #339933;">=</span> beanMethodCache.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>beanClass<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>beanMethods <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				beanMethods <span style="color: #339933;">=</span> beanClass.<span style="color: #006633;">getMethods</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				beanMethodCache.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span>beanClass, beanMethods<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
&nbsp;
			HashMap<span style="color: #339933;">&lt;</span>String, Method<span style="color: #339933;">&gt;</span> fromBeanMethods <span style="color: #339933;">=</span> fromBeanMethodCache.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>formBeanClass<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>fromBeanMethods <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				fromBeanMethods <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> HashMap<span style="color: #339933;">&lt;</span>String, Method<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #003399;">Method</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> methods <span style="color: #339933;">=</span> formBeanClass.<span style="color: #006633;">getMethods</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #003399;">String</span> getMethodName <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
				<span style="color: #000000; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Method</span> method<span style="color: #339933;">:</span> methods<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
					getMethodName <span style="color: #339933;">=</span> method.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> getMethodName.<span style="color: #006633;">startsWith</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;get&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> getMethodName.<span style="color: #006633;">startsWith</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;is&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
						fromBeanMethods.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span>getMethodName, method<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span>
				fromBeanMethodCache.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span>formBeanClass, fromBeanMethods<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
&nbsp;
			<span style="color: #003399;">String</span> methodName  <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
			<span style="color: #003399;">String</span> getMethodName <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">Class</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> paramsType <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">Class</span> paramType <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Method</span> method<span style="color: #339933;">:</span> beanMethods<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				methodName <span style="color: #339933;">=</span> method.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>				
				<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>methodName.<span style="color: #006633;">startsWith</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;set&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
					paramsType <span style="color: #339933;">=</span> method.<span style="color: #006633;">getParameterTypes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>paramsType.<span style="color: #006633;">length</span> <span style="color: #339933;">!=</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>
						<span style="color: #000000; font-weight: bold;">continue</span><span style="color: #339933;">;</span>
&nbsp;
					paramType <span style="color: #339933;">=</span> paramsType<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
					<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>paramType.<span style="color: #006633;">isInstance</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">boolean</span>.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
						getMethodName <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;is&quot;</span><span style="color: #339933;">+</span>methodName.<span style="color: #006633;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					<span style="color: #009900;">&#125;</span><span style="color: #000000; font-weight: bold;">else</span><span style="color: #009900;">&#123;</span>
						getMethodName <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;get&quot;</span><span style="color: #339933;">+</span>methodName.<span style="color: #006633;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					<span style="color: #009900;">&#125;</span>
					<span style="color: #003399;">Method</span> formBeanGetMethod <span style="color: #339933;">=</span> fromBeanMethods.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>getMethodName<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>formBeanGetMethod <span style="color: #339933;">!=</span><span style="color: #000066; font-weight: bold;">null</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
						<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> paramType.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span> formBeanGetMethod.<span style="color: #006633;">getReturnType</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
							<span style="color: #003399;">Object</span> value <span style="color: #339933;">=</span> formBeanGetMethod.<span style="color: #006633;">invoke</span><span style="color: #009900;">&#40;</span>fromBean,objects<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
							<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>value <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
								method.<span style="color: #006633;">invoke</span><span style="color: #009900;">&#40;</span>bean,<span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Object</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#123;</span>value<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
							<span style="color: #009900;">&#125;</span>
						<span style="color: #009900;">&#125;</span>
					<span style="color: #009900;">&#125;</span>
				<span style="color: #009900;">&#125;</span>				
			<span style="color: #009900;">&#125;</span>		
			<span style="color: #000000; font-weight: bold;">return</span> bean<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Exception</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>	
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>第二个版本对</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #003399;">Method</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> beanMethods <span style="color: #339933;">=</span> beanClass.<span style="color: #006633;">getMethods</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003399;">Method</span> formBeanGetMethod <span style="color: #339933;">=</span> formBeanClass.<span style="color: #006633;">getMethod</span><span style="color: #009900;">&#40;</span>getMethodName, classes<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>两处做了缓存,缓存后,性能与直接get/set相差大概还有180倍左右,但相对Jakarta-Common-BeanUtils已经有很大的提高.如果大家有更好的办法,请留言讨论</p>
]]></content:encoded>
			<wfw:commentRss>http://www.voland.com.cn/javabean-properties-to-achieve-high-performance-replication-tool-beanutils/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java版本的任务引擎(定时调度器)</title>
		<link>http://www.voland.com.cn/java-task-enginejava-version-of-the-task-engine-time-scheduler</link>
		<comments>http://www.voland.com.cn/java-task-enginejava-version-of-the-task-engine-time-scheduler#comments</comments>
		<pubDate>Tue, 31 May 2011 07:04:29 +0000</pubDate>
		<dc:creator>Nortan</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.voland.com.cn/?p=624</guid>
		<description><![CDATA[java的任务引擎(定时调度器)比较多,可以直接使用Timer与TimerTask来写一个,也可以使用Quartz这样的成熟组件.我是一个代码洁癖者,如果在代码中零散的使用Timer与TimerTask我会很难受,同时我也不喜欢引用太多的第三方jar包,因为那样看起来项目会很臃肿,也或会出现无法控制的情况!所以当我需要一个任务引擎(定时调度器),我没有使用成熟的Quartz,而是对Timer与TimerTask做了一个轻量的封装. 在我的想法里,任务引擎至少应该有如下功能: 线程可控 在线程池中可以快速执行一个任务 可以固定延时执行循环执行任务 以固定速率执行循环执行任务 可以方便取消任何任务 基于上面的想法,Java版本的任务引擎可以简单的封装成如下: package com.voland.utils; &#160; import java.util.Date; import java.util.Map; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; &#160; /** * 任务引擎，在指定是时间或者立即执行特定的任务，所有执行的任务都在指定的线程池中。 * 如果在指定的时间执行特定任务时，线程池中没有空闲的线程，那么这个任务也将排队等待有空闲的线程。 * 这个任务引擎你可以看成是有线程管理的{@link Thread} 或者是{@line TimerTask}. * @author nortan * */ public class TaskEngine &#123; &#160; private static TaskEngine instance = new TaskEngine&#40;&#41;; &#160; /** * 返回一个任务引擎实例 [...]]]></description>
			<content:encoded><![CDATA[<p>java的任务引擎(定时调度器)比较多,可以直接使用Timer与TimerTask来写一个,也可以使用Quartz这样的成熟组件.我是一个代码洁癖者,如果在代码中零散的使用Timer与TimerTask我会很难受,同时我也不喜欢引用太多的第三方jar包,因为那样看起来项目会很臃肿,也或会出现无法控制的情况!所以当我需要一个任务引擎(定时调度器),我没有使用成熟的Quartz,而是对Timer与TimerTask做了一个轻量的封装.</p>
<p>在我的想法里,任务引擎至少应该有如下功能:</p>
<ul>
<li>线程可控</li>
<li>在线程池中可以快速执行一个任务</li>
<li>可以固定延时执行循环执行任务</li>
<li>以固定速率执行循环执行任务</li>
<li>可以方便取消任何任务</li>
</ul>
<p>基于上面的想法,Java版本的任务引擎可以简单的封装成如下:<span id="more-624"></span></p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">com.voland.utils</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.Date</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.Map</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.Timer</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.TimerTask</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.concurrent.*</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.concurrent.atomic.AtomicInteger</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #008000; font-style: italic; font-weight: bold;">/**
 * 任务引擎，在指定是时间或者立即执行特定的任务，所有执行的任务都在指定的线程池中。
 * 如果在指定的时间执行特定任务时，线程池中没有空闲的线程，那么这个任务也将排队等待有空闲的线程。
 * 这个任务引擎你可以看成是有线程管理的{@link Thread} 或者是{@line TimerTask}.
 * @author nortan
 *
 */</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TaskEngine <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> TaskEngine instance <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> TaskEngine<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #008000; font-style: italic; font-weight: bold;">/**
     * 返回一个任务引擎实例
     * @return
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> TaskEngine getInstance<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> instance<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">Timer</span> timer<span style="color: #339933;">;</span>	<span style="color: #666666; font-style: italic;">//定时器</span>
    <span style="color: #000000; font-weight: bold;">private</span> ExecutorService executor<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//执行管理服务</span>
    <span style="color: #000000; font-weight: bold;">private</span> Map<span style="color: #339933;">&lt;</span>TimerTask, TimerTaskWrapper<span style="color: #339933;">&gt;</span> wrappedTasks <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ConcurrentHashMap<span style="color: #339933;">&lt;</span>TimerTask, TimerTaskWrapper<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">boolean</span> daemon <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #008000; font-style: italic; font-weight: bold;">/**
     * 构造一个新的引擎
     */</span>
    <span style="color: #000000; font-weight: bold;">private</span> TaskEngine<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        timer <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Timer</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;timer-openfire&quot;</span>, daemon<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        executor <span style="color: #339933;">=</span> Executors.<span style="color: #006633;">newCachedThreadPool</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> ThreadFactory<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">final</span> AtomicInteger threadNumber <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> AtomicInteger<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Thread</span> newThread<span style="color: #009900;">&#40;</span><span style="color: #003399;">Runnable</span> runnable<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #666666; font-style: italic;">// 使用我们自己的线程命名方式</span>
                <span style="color: #003399;">Thread</span> thread <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Thread</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Thread</span>.<span style="color: #006633;">currentThread</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getThreadGroup</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, runnable,
                                      <span style="color: #0000ff;">&quot;pool-netmachine&quot;</span> <span style="color: #339933;">+</span> threadNumber.<span style="color: #006633;">getAndIncrement</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #666666; font-style: italic;">// 设置任务为守护进程</span>
                thread.<span style="color: #006633;">setDaemon</span><span style="color: #009900;">&#40;</span>daemon<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>thread.<span style="color: #006633;">getPriority</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #003399;">Thread</span>.<span style="color: #006633;">NORM_PRIORITY</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    thread.<span style="color: #006633;">setPriority</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Thread</span>.<span style="color: #006633;">NORM_PRIORITY</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #000000; font-weight: bold;">return</span> thread<span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #008000; font-style: italic; font-weight: bold;">/**
     * 提交一个实时执行的任务也是需要排队的
     * @param task
     * @return
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> Future<span style="color: #339933;">&lt;?&gt;</span> submit<span style="color: #009900;">&#40;</span><span style="color: #003399;">Runnable</span> task<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> executor.<span style="color: #006633;">submit</span><span style="color: #009900;">&#40;</span>task<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #008000; font-style: italic; font-weight: bold;">/**
     * 延迟时间来执行特定的task
     * @param task
     * @param delay 延迟的时间,单位：毫秒
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> schedule<span style="color: #009900;">&#40;</span><span style="color: #003399;">TimerTask</span> task, <span style="color: #000066; font-weight: bold;">long</span> delay<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        timer.<span style="color: #006633;">schedule</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> TimerTaskWrapper<span style="color: #009900;">&#40;</span>task<span style="color: #009900;">&#41;</span>, delay<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #008000; font-style: italic; font-weight: bold;">/**
     * 在指定时间执行任务
     * @param task
     * @param time
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> schedule<span style="color: #009900;">&#40;</span><span style="color: #003399;">TimerTask</span> task, <span style="color: #003399;">Date</span> time<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        timer.<span style="color: #006633;">schedule</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> TimerTaskWrapper<span style="color: #009900;">&#40;</span>task<span style="color: #009900;">&#41;</span>, time<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #008000; font-style: italic; font-weight: bold;">/**
     * 延迟一定时间后，固定延时执行循环执行任务，可以参看{@link Timer#schedule()}
     * @param task
     * @param delay
     * @param period，循环任务间的间隔时间，以毫秒为单位
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> schedule<span style="color: #009900;">&#40;</span><span style="color: #003399;">TimerTask</span> task, <span style="color: #000066; font-weight: bold;">long</span> delay, <span style="color: #000066; font-weight: bold;">long</span> period<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        TimerTaskWrapper taskWrapper <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> TimerTaskWrapper<span style="color: #009900;">&#40;</span>task<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        wrappedTasks.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span>task, taskWrapper<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        timer.<span style="color: #006633;">schedule</span><span style="color: #009900;">&#40;</span>taskWrapper, delay, period<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #008000; font-style: italic; font-weight: bold;">/**
     * 在指定的时间执行第一次任务，以后循环执行
     * @param task
     * @param firstTime
     * @param period
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> schedule<span style="color: #009900;">&#40;</span><span style="color: #003399;">TimerTask</span> task, <span style="color: #003399;">Date</span> firstTime, <span style="color: #000066; font-weight: bold;">long</span> period<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        TimerTaskWrapper taskWrapper <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> TimerTaskWrapper<span style="color: #009900;">&#40;</span>task<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        wrappedTasks.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span>task, taskWrapper<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        timer.<span style="color: #006633;">schedule</span><span style="color: #009900;">&#40;</span>taskWrapper, firstTime, period<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
   <span style="color: #666666; font-style: italic;">/***
    * 延迟一定时间后，以固定速率执行循环执行任务，用来执行绝对 时间敏感的重复执行活动，如每小时准点打钟报时等等。
    * @param task
    * @param delay
    * @param period
    */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> scheduleAtFixedRate<span style="color: #009900;">&#40;</span><span style="color: #003399;">TimerTask</span> task, <span style="color: #000066; font-weight: bold;">long</span> delay, <span style="color: #000066; font-weight: bold;">long</span> period<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        TimerTaskWrapper taskWrapper <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> TimerTaskWrapper<span style="color: #009900;">&#40;</span>task<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        wrappedTasks.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span>task, taskWrapper<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        timer.<span style="color: #006633;">scheduleAtFixedRate</span><span style="color: #009900;">&#40;</span>taskWrapper, delay, period<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #008000; font-style: italic; font-weight: bold;">/**
     * 
     * @param task
     * @param firstTime 第一次执行时间
     * @param period 固定速率间隔时间
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> scheduleAtFixedRate<span style="color: #009900;">&#40;</span><span style="color: #003399;">TimerTask</span> task, <span style="color: #003399;">Date</span> firstTime, <span style="color: #000066; font-weight: bold;">long</span> period<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        TimerTaskWrapper taskWrapper <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> TimerTaskWrapper<span style="color: #009900;">&#40;</span>task<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        wrappedTasks.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span>task, taskWrapper<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        timer.<span style="color: #006633;">scheduleAtFixedRate</span><span style="color: #009900;">&#40;</span>taskWrapper, firstTime, period<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #008000; font-style: italic; font-weight: bold;">/**
     * 取消任务执行 {@link java.util.TimerTask#cancel()}
     *
     * @param task 需要取消的任务.
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> cancelScheduledTask<span style="color: #009900;">&#40;</span><span style="color: #003399;">TimerTask</span> task<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        TaskEngine.<span style="color: #006633;">TimerTaskWrapper</span> taskWrapper <span style="color: #339933;">=</span> wrappedTasks.<span style="color: #006633;">remove</span><span style="color: #009900;">&#40;</span>task<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>taskWrapper <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            taskWrapper.<span style="color: #006633;">cancel</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #008000; font-style: italic; font-weight: bold;">/**
     * 关闭任务服务
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> shutdown<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>executor <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            executor.<span style="color: #006633;">shutdownNow</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            executor <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>timer <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            timer.<span style="color: #006633;">cancel</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            timer <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">class</span> TimerTaskWrapper <span style="color: #000000; font-weight: bold;">extends</span> <span style="color: #003399;">TimerTask</span> <span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">TimerTask</span> task<span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">public</span> TimerTaskWrapper<span style="color: #009900;">&#40;</span><span style="color: #003399;">TimerTask</span> task<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">task</span> <span style="color: #339933;">=</span> task<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> run<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            executor.<span style="color: #006633;">submit</span><span style="color: #009900;">&#40;</span>task<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.voland.com.cn/java-task-enginejava-version-of-the-task-engine-time-scheduler/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>用生产消费者模式实现数据队列定时或定量的异步存储</title>
		<link>http://www.voland.com.cn/consumer-model-with-production-time-or-quantitative-data-queue-asynchronous-memory</link>
		<comments>http://www.voland.com.cn/consumer-model-with-production-time-or-quantitative-data-queue-asynchronous-memory#comments</comments>
		<pubDate>Sun, 06 Mar 2011 09:13:08 +0000</pubDate>
		<dc:creator>Nortan</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[一起分享]]></category>
		<category><![CDATA[多线程]]></category>

		<guid isPermaLink="false">http://www.voland.com.cn/?p=583</guid>
		<description><![CDATA[需求： 最近在考虑IM软件服务器端编程，有这样一个需求，就是把用户发的信息，全部保存到数据库中，如果是一般的web应用，可能就直接把用户提交的数据写入数据库了，但IM的信息的特点时，需要响应快（实时处理），数据量大，根据这个特点，我设计成接收转发模块与数据写入数据库为不同的模块，很明显，他们满足生产消费者模式，即某个模块负责产生数据，这些数据由另一个模块来负责处理（此处的模块是广义的，可以是类、函数、线程、进程等）。产生数据的模块，就形象地称为生产者；而处理数据的模块，就称为消费者。生产者与消费者并没有构成生产消费者模式，而生产者生产的数据由消费者消费的过程才能构成生产消费者模式。 设计： 生产者和消费者模式实现方式很多，但在实现的时候我们至少需要考虑生产消费解耦、支持并发、支持生产消费忙闲不均的情况。 一、解耦 　　假设生产者和消费者分别是两个类。如果让生产者直接调用消费者的某个方法，那么生产者对于消费者就会产生依赖（也就是耦合）。将来如果消费者的代码发生变化，可能会影响到生产者。而如果两者都依赖于某个缓冲区，两者之间不直接依赖，耦合也就相应降低了。这个缓冲区我们可以用一个列队实现。 　　 二、支持并发（concurrency） 　　生产者直接调用消费者的某个方法，还有另一个弊端。由于函数调用是同步的（或者叫阻塞的），在消费者的方法没有返回之前，生产者只好一直等在那边。万一消费者处理数据很慢，生产者就会白白糟蹋大好时光。 　　使用了生产者／消费者模式之后，生产者和消费者可以是两个独立的并发主体。生产者把制造出来的数据往缓冲区一丢，就可以再去生产下一个数据。基本上不用依赖消费者的处理速度。其实当初这个模式，主要就是用来处理并发问题的。这样高并发下，用户感觉响应很快：） 　　 三、支持忙闲不均 　　缓冲区还有另一个好处。如果制造数据的速度时快时慢，缓冲区的好处就体现出来了。当数据制造快的时候，消费者来不及处理，未处理的数据可以暂时存在缓冲区中。等生产者的制造速度慢下来，消费者再慢慢处理掉。 除了以上三个需要考虑的，在我的项目中，我还要考虑与数据库的交互不能太频繁，只能满足一定数据量时，使用批量方式写入数据库（定量写入），这个实现本身很简单，但如果考虑到服务器清闲时，很长时间都达不到这个数据量，但这段时间内可能会停机，没有写入数据库的数据就可能丢失，所以在给定的一段时间里，数据量没有到达给定数据的条件，只要达到时间条件，也需要写入数据库。 实现： 基于以上的想法，我们可以使用java.util.concurrent.BlockingQueue来实现，这里仅分析一些关键代码 1、构造一个用于数据缓冲区的队列 final static BlockingQueue&#60;Message&#62; queue = new LinkedBlockingQueue&#60;Message&#62;&#40;&#41;; 2、生产者生产的数据放入队列 // 本方法由生产者调用，将生产的数据放入队列 public static void add&#40;Message m&#41; &#123; try &#123; queue.put&#40;m&#41;; &#125; catch &#40;InterruptedException e&#41; &#123; e.printStackTrace&#40;&#41;; &#125; &#125; 3、消费者对产生的数据进行消费 @Override public void run&#40;&#41; &#123; try &#123; while &#40;true&#41; &#123; [...]]]></description>
			<content:encoded><![CDATA[<p>需求：<br />
最近在考虑IM软件服务器端编程，有这样一个需求，就是把用户发的信息，全部保存到数据库中，如果是一般的web应用，可能就直接把用户提交的数据写入数据库了，但IM的信息的特点时，需要响应快（实时处理），数据量大，根据这个特点，我设计成接收转发模块与数据写入数据库为不同的模块，很明显，他们满足生产消费者模式，即某个模块负责产生数据，这些数据由另一个模块来负责处理（此处的模块是广义的，可以是类、函数、线程、进程等）。产生数据的模块，就形象地称为生产者；而处理数据的模块，就称为消费者。生产者与消费者并没有构成生产消费者模式，而生产者生产的数据由消费者消费的过程才能构成生产消费者模式。</p>
<p>设计：<br />
生产者和消费者模式实现方式很多，但在实现的时候我们至少需要考虑生产消费解耦、支持并发、支持生产消费忙闲不均的情况。<br />
一、解耦<br />
　　假设生产者和消费者分别是两个类。如果让生产者直接调用消费者的某个方法，那么生产者对于消费者就会产生依赖（也就是耦合）。将来如果消费者的代码发生变化，可能会影响到生产者。而如果两者都依赖于某个缓冲区，两者之间不直接依赖，耦合也就相应降低了。这个缓冲区我们可以用一个列队实现。<br />
　　<br />
二、支持并发（concurrency）<br />
　　生产者直接调用消费者的某个方法，还有另一个弊端。由于函数调用是同步的（或者叫阻塞的），在消费者的方法没有返回之前，生产者只好一直等在那边。万一消费者处理数据很慢，生产者就会白白糟蹋大好时光。<br />
　　使用了生产者／消费者模式之后，生产者和消费者可以是两个独立的并发主体。生产者把制造出来的数据往缓冲区一丢，就可以再去生产下一个数据。基本上不用依赖消费者的处理速度。其实当初这个模式，主要就是用来处理并发问题的。这样高并发下，用户感觉响应很快：）<br />
　　<br />
三、支持忙闲不均<br />
　　缓冲区还有另一个好处。如果制造数据的速度时快时慢，缓冲区的好处就体现出来了。当数据制造快的时候，消费者来不及处理，未处理的数据可以暂时存在缓冲区中。等生产者的制造速度慢下来，消费者再慢慢处理掉。 </p>
<p>除了以上三个需要考虑的，在我的项目中，我还要考虑与数据库的交互不能太频繁，只能满足一定数据量时，使用批量方式写入数据库（定量写入），这个实现本身很简单，但如果考虑到服务器清闲时，很长时间都达不到这个数据量，但这段时间内可能会停机，没有写入数据库的数据就可能丢失，所以在给定的一段时间里，数据量没有到达给定数据的条件，只要达到时间条件，也需要写入数据库。</p>
<p>实现：<br />
基于以上的想法，我们可以使用java.util.concurrent.BlockingQueue来实现，这里仅分析一些关键代码<span id="more-583"></span><br />
1、构造一个用于数据缓冲区的队列</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000000; font-weight: bold;">static</span> BlockingQueue<span style="color: #339933;">&lt;</span>Message<span style="color: #339933;">&gt;</span> queue <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> LinkedBlockingQueue<span style="color: #339933;">&lt;</span>Message<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>2、生产者生产的数据放入队列</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// 本方法由生产者调用，将生产的数据放入队列</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> add<span style="color: #009900;">&#40;</span>Message m<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			queue.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span>m<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">InterruptedException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>			
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span></pre></div></div>

<p>3、消费者对产生的数据进行消费</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">        @Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> run<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				consume<span style="color: #009900;">&#40;</span>queue.<span style="color: #006633;">take</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">InterruptedException</span> ex<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			ex.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 消费数据，把数据放在list中，便于对数据的批量写入数据库
	 * @param message
	 */</span>
	<span style="color: #000066; font-weight: bold;">void</span> consume<span style="color: #009900;">&#40;</span>Message message<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">synchronized</span><span style="color: #009900;">&#40;</span>list<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>			
			list.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>message<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>list.<span style="color: #006633;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">100</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				insert<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;满足100&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>		
	<span style="color: #009900;">&#125;</span></pre></div></div>

<p>4、把数据批量写入数据库</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 因为list可能同时被消费者、定时器操作，所以这里使用对list同步
	 * @param type
	 */</span>
	<span style="color: #000066; font-weight: bold;">void</span> insert<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> type<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">synchronized</span><span style="color: #009900;">&#40;</span>list<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>list.<span style="color: #006633;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>
				<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>type<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #003399;">String</span> name <span style="color: #339933;">=</span> <span style="color: #003399;">Thread</span>.<span style="color: #006633;">currentThread</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span>Message message <span style="color: #339933;">:</span> list<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				log.<span style="color: #006633;">debug</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;消费者：&quot;</span><span style="color: #339933;">+</span>message.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #0000ff;">&quot; ---&quot;</span><span style="color: #339933;">+</span>name<span style="color: #339933;">+</span><span style="color: #0000ff;">&quot; &quot;</span><span style="color: #339933;">+</span>type<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
			list.<span style="color: #006633;">clear</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>5、满足时间条件时，批量把数据写入数据库</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> TimerInsert <span style="color: #000000; font-weight: bold;">extends</span> <span style="color: #003399;">TimerTask</span><span style="color: #009900;">&#123;</span>
	Consumer consumer<span style="color: #339933;">;</span>
	TimerInsert<span style="color: #009900;">&#40;</span>Consumer consumer<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">consumer</span> <span style="color: #339933;">=</span> consumer<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> run<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		consumer.<span style="color: #006633;">insert</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;满足时间&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>		
	<span style="color: #009900;">&#125;</span>	
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>具体代码请参看附件中的代码.<a href="wp-content/uploads/2011/03/task.rar">下载</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.voland.com.cn/consumer-model-with-production-time-or-quantitative-data-queue-asynchronous-memory/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>用java程序向wordpress发布文章</title>
		<link>http://www.voland.com.cn/java-program-to-wordpress-with-articles-published</link>
		<comments>http://www.voland.com.cn/java-program-to-wordpress-with-articles-published#comments</comments>
		<pubDate>Thu, 13 May 2010 01:42:52 +0000</pubDate>
		<dc:creator>Nortan</dc:creator>
				<category><![CDATA[人生百味]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[XML-RPC]]></category>

		<guid isPermaLink="false">http://www.voland.com.cn/?p=486</guid>
		<description><![CDATA[java向wordpress发布文章也成？当然成！不仅能发布文章，读写都不成问题，还很方便，这些便利得益于XML-RPC协议。WordPress提供了XML-RPC API使得第三方的可以与之通信来发布和修改博客。我们也可以使用这个接口做一些工作，例如：在网站首页显示最新的博客、在博客之外的页面上发表博客文章、把博客与其他内容管理系统结合等。 一、开启XML-RPC支持 WordPress的XML-RPC协议默认是未开启的，需要到管理后台的“设置&#8211;>撰写”里的“远程发布”给XML-RPC打上勾。其说明文字为：启用 WordPress，Movable Type，MetaWeblog和Blogger 的 XML-RPC发布协议。 二、API接口选择 WordPress提供了对Blogger API、metaWeblog API、Movable Type API以及其自身的WordPress API的支持。其中WordPress API最为丰富，提供了包括操作评论文章在内的各种各样的支持。Blogger API功能较少，基本上淘汰不用了；而metaWeblog API提供了常用的接口且参数比较简洁，用得较多一些。所以我们以它作为例子。 三、例子代码 这个例子中，需要用到apache的XML-RPC项目包,大家可以到 apache 官方下载,使用这个例子，就可以与昨天的《通用文章采集器的设计与实现》结合，来生成自动发布的站点了，这个慎用哦，后果自负：） import java.net.URL; import java.util.HashMap; import java.util.Map; &#160; import org.apache.xmlrpc.client.XmlRpcClient; import org.apache.xmlrpc.client.XmlRpcClientConfigImpl; &#160; public class Test &#123; public static void post&#40;String title, String content&#41; &#123; try&#123; // Set up XML-RPC connection to server String [...]]]></description>
			<content:encoded><![CDATA[<p>java向wordpress发布文章也成？当然成！不仅能发布文章，读写都不成问题，还很方便，这些便利得益于XML-RPC协议。WordPress提供了XML-RPC API使得第三方的可以与之通信来发布和修改博客。我们也可以使用这个接口做一些工作，例如：在网站首页显示最新的博客、在博客之外的页面上发表博客文章、把博客与其他内容管理系统结合等。<span id="more-486"></span></p>
<p>一、开启XML-RPC支持</p>
<p>WordPress的XML-RPC协议默认是未开启的，需要到管理后台的“设置&#8211;>撰写”里的“远程发布”给XML-RPC打上勾。其说明文字为：启用 WordPress，Movable Type，MetaWeblog和Blogger 的 XML-RPC发布协议。</p>
<p>二、API接口选择</p>
<p>WordPress提供了对Blogger API、metaWeblog API、Movable Type API以及其自身的WordPress API的支持。其中WordPress API最为丰富，提供了包括操作评论文章在内的各种各样的支持。Blogger API功能较少，基本上淘汰不用了；而metaWeblog API提供了常用的接口且参数比较简洁，用得较多一些。所以我们以它作为例子。</p>
<p>三、例子代码</p>
<p>这个例子中，需要用到apache的XML-RPC项目包,大家可以到 <a href="http://ws.apache.org/xmlrpc/download.html" target="_blank">apache 官方</a>下载,使用这个例子，就可以与昨天的《<a href="http://www.voland.com.cn/common-article-collection-design-and-implementation">通用文章采集器的设计与实现</a>》结合，来生成自动发布的站点了，这个慎用哦，后果自负：）</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.net.URL</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.HashMap</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.Map</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.xmlrpc.client.XmlRpcClient</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.xmlrpc.client.XmlRpcClientConfigImpl</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Test <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> post<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> title, <span style="color: #003399;">String</span> content<span style="color: #009900;">&#41;</span>  <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">try</span><span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">// Set up XML-RPC connection to server</span>
                        <span style="color: #003399;">String</span> domain <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;www.extbi.com&quot;</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//你网站的域名</span>
			XmlRpcClientConfigImpl config <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> XmlRpcClientConfigImpl<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			config.<span style="color: #006633;">setServerURL</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">URL</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;http://&quot;</span><span style="color: #339933;">+</span>domain<span style="color: #339933;">+</span><span style="color: #0000ff;">&quot;/xmlrpc.php&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			XmlRpcClient client <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> XmlRpcClient<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			client.<span style="color: #006633;">setConfig</span><span style="color: #009900;">&#40;</span>config<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #666666; font-style: italic;">// Set up parameters required by newPost method</span>
			<span style="color: #003399;">Map</span> post <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">HashMap</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			post.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;title&quot;</span>, title<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//标题</span>
			post.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;mt_keywords&quot;</span>, <span style="color: #0000ff;">&quot;标签,标签2,标签3&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//标签</span>
			<span style="color: #003399;">Object</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> categories <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Object</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#123;</span> <span style="color: #0000ff;">&quot;服饰&quot;</span>,<span style="color: #0000ff;">&quot;数码&quot;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//分类</span>
			post.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;categories&quot;</span>, categories<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			post.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;description&quot;</span>, content<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//内容</span>
			<span style="color: #003399;">Object</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> params <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Object</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#123;</span> <span style="color: #0000ff;">&quot;1&quot;</span>, <span style="color: #0000ff;">&quot;用户名&quot;</span>, <span style="color: #0000ff;">&quot;密码&quot;</span>, post,
					<span style="color: #003399;">Boolean</span>.<span style="color: #000066; font-weight: bold;">TRUE</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #666666; font-style: italic;">// Call newPost</span>
			<span style="color: #003399;">String</span> result <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#41;</span> client.<span style="color: #006633;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;metaWeblog.newPost&quot;</span>, params<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot; Created with blogid &quot;</span> <span style="color: #339933;">+</span> result<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Exception</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">// TODO: handle exception</span>
                       <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot; UnCreated &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>四、畅想</p>
<p>博客有如此大强大，灵活，好用的接口 ，那为什么国内常用的CMS没有呢？做一个也花不了多少时间，当然，在实际的管理软件中，如CRM中，我建议也可以加入这样的接口，那与其它系统集成是多么爽的一件事情。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.voland.com.cn/java-program-to-wordpress-with-articles-published/feed</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>通用文章采集器的设计与实现</title>
		<link>http://www.voland.com.cn/common-article-collection-design-and-implementation</link>
		<comments>http://www.voland.com.cn/common-article-collection-design-and-implementation#comments</comments>
		<pubDate>Wed, 12 May 2010 02:40:30 +0000</pubDate>
		<dc:creator>Nortan</dc:creator>
				<category><![CDATA[人生百味]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[采集器]]></category>

		<guid isPermaLink="false">http://www.voland.com.cn/?p=478</guid>
		<description><![CDATA[java实现通用文章采集器，可以采集一个给定文章列表URL中的所有文章及文章有内分页的情况。制作个性采集器必看！]]></description>
			<content:encoded><![CDATA[<p>最近头脑有点发热，想做一个采集器来采集文章，然后做一个类似垃圾站的东西，当然，使用的文章发布程序还是用wordpress,wordpress上的采集器不太多，他们大多都是通过rss采集，这也不太合适我，因为如果做为文章采集，采集的对象可能有文章内分页，所以最终还是自己写一个程序吧，自己最熟悉的还是java,那就用java写吧。</p>
<p>采集一堆文章，主要有如下步骤：<br />
第一：采集规则定义<br />
第二：按指定的规则进行文章采集</p>
<p>根据以上步骤，我们分开来实现。采集规则的定义实际就是你要做什么，怎么做的定义，我们这里很明确，就是指定一个列表的url地址，提取列表中所有文章的url，然后再一一采集各文章中的标题、内容，如果每篇文章有内分页，还要分别提取。所以，我们首先要做的，就是给定一个url地址，取得对应的html源码。下面是一个实现，它模拟浏览器，向url发出http请求，服务器返回<span id="more-478"></span>的结果，就是我们需要得到的东西。</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 给定一个列表url，得到本url对象的html,然后其它操作在这个基础上做
	 * @param url 
	 * @param encoding   返回html的编码方式，如GBK，UTF─8
	 * @return
	 * @throws Exception
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> getHtml<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> url, <span style="color: #003399;">String</span> encoding<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">Exception</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">String</span> value <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
		HttpClient httpclient <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DefaultHttpClient<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>        
        HttpGet httpget <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> HttpGet<span style="color: #009900;">&#40;</span>url<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// 以下这条如果不加会发现无论你设置Accept-Charset为gbk还是utf-8，他都会默认返回gb2312（本例针对google.cn来说）</span>
        httpget.<span style="color: #006633;">setHeader</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;User-Agent&quot;</span>, <span style="color: #0000ff;">&quot;Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.2)&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">// 用逗号分隔显示可以同时接受多种编码</span>
        httpget.<span style="color: #006633;">setHeader</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Accept-Language&quot;</span>, <span style="color: #0000ff;">&quot;zh-cn,zh;q=0.5&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        httpget.<span style="color: #006633;">setHeader</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Accept-Charset&quot;</span>, <span style="color: #0000ff;">&quot;GB2312,utf-8;q=0.7,*;q=0.7&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>        
        HttpResponse response <span style="color: #339933;">=</span> httpclient.<span style="color: #006633;">execute</span><span style="color: #009900;">&#40;</span>httpget<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>     
&nbsp;
        <span style="color: #666666; font-style: italic;">// 判断页面返回状态判断是否进行转向抓取新链接</span>
        <span style="color: #000066; font-weight: bold;">int</span> statusCode <span style="color: #339933;">=</span> response.<span style="color: #006633;">getStatusLine</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getStatusCode</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>statusCode <span style="color: #339933;">==</span> HttpStatus.<span style="color: #006633;">SC_MOVED_PERMANENTLY</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span>
                <span style="color: #009900;">&#40;</span>statusCode <span style="color: #339933;">==</span> HttpStatus.<span style="color: #006633;">SC_MOVED_TEMPORARILY</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span>
                <span style="color: #009900;">&#40;</span>statusCode <span style="color: #339933;">==</span> HttpStatus.<span style="color: #006633;">SC_SEE_OTHER</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span>
                <span style="color: #009900;">&#40;</span>statusCode <span style="color: #339933;">==</span> HttpStatus.<span style="color: #006633;">SC_TEMPORARY_REDIRECT</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #666666; font-style: italic;">// 此处重定向处理  此处还未验证</span>
            <span style="color: #003399;">String</span> newUri <span style="color: #339933;">=</span> response.<span style="color: #006633;">getLastHeader</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Location&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getValue</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            httpclient <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DefaultHttpClient<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            httpget <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> HttpGet<span style="color: #009900;">&#40;</span>newUri<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            response <span style="color: #339933;">=</span> httpclient.<span style="color: #006633;">execute</span><span style="color: #009900;">&#40;</span>httpget<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Get hold of the response entity</span>
        HttpEntity entity <span style="color: #339933;">=</span> response.<span style="color: #006633;">getEntity</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>        
        <span style="color: #666666; font-style: italic;">// If the response does not enclose an entity, there is no need</span>
        <span style="color: #666666; font-style: italic;">// to bother about connection release</span>
        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>entity <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #666666; font-style: italic;">// 将源码流保存在一个byte数组当中，因为可能需要两次用到该流，</span>
            <span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> bytes <span style="color: #339933;">=</span> EntityUtils.<span style="color: #006633;">toByteArray</span><span style="color: #009900;">&#40;</span>entity<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #666666; font-style: italic;">// 如果头部Content-Type中包含了编码信息，那么我们可以直接在此处获取</span>
&nbsp;
            <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>encoding <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span><span style="color: #0000ff;">&quot;&quot;</span>.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span>encoding.<span style="color: #006633;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
            	value <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#40;</span>bytes, encoding<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #000000; font-weight: bold;">else</span><span style="color: #009900;">&#123;</span>
            	<span style="color: #003399;">String</span> charSet <span style="color: #339933;">=</span> EntityUtils.<span style="color: #006633;">getContentCharSet</span><span style="color: #009900;">&#40;</span>entity<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            	<span style="color: #666666; font-style: italic;">// 如果头部中没有，那么我们需要 查看页面源码，这个方法虽然不能说完全正确，因为有些粗糙的网页编码者没有在页面中写头部编码信息</span>
	            <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>charSet <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span> <span style="color: #339933;">||</span> <span style="color: #0000ff;">&quot;&quot;</span>.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span>charSet.<span style="color: #006633;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	                <span style="color: #003399;">String</span> regEx<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;(?=&lt;meta).*?(?&lt;=charset=[<span style="color: #000099; font-weight: bold;">\\</span>'|<span style="color: #000099; font-weight: bold;">\\</span><span style="color: #000099; font-weight: bold;">\&quot;</span>]?)([[a-z]|[A-Z]|[0-9]|-]*)&quot;</span><span style="color: #339933;">;</span>
	                Pattern p<span style="color: #339933;">=</span>Pattern.<span style="color: #006633;">compile</span><span style="color: #009900;">&#40;</span>regEx, Pattern.<span style="color: #006633;">CASE_INSENSITIVE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	                Matcher m<span style="color: #339933;">=</span>p.<span style="color: #006633;">matcher</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#40;</span>bytes<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;">// 默认编码转成字符串，因为我们的匹配中无中文，所以串中可能的乱码对我们没有影响</span>
	                <span style="color: #000066; font-weight: bold;">boolean</span> result<span style="color: #339933;">=</span>m.<span style="color: #006633;">find</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	                <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>m.<span style="color: #006633;">groupCount</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	                    charSet <span style="color: #339933;">=</span> m.<span style="color: #006633;">group</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	                <span style="color: #009900;">&#125;</span>
	            <span style="color: #009900;">&#125;</span>
	            value <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#40;</span>bytes, charSet<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>       
        <span style="color: #009900;">&#125;</span>
&nbsp;
        httpclient.<span style="color: #006633;">getConnectionManager</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">shutdown</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>   
        <span style="color: #000000; font-weight: bold;">return</span> value<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span></pre></div></div>

<p><code>注意，这里用到了Apache的HttpClient项目，由于空间有限，我这里不上传本函数所依赖的包，请大家自己到apache下载。</code></p>
<p>以淘宝的女人门户为例子，我给定http://info.taobao.com/list/lady/23/30/2330b6ed-16ce-4d0e-b7fa-58a411e1871a_1.php这个url地址，它会返回一个包含文章列表的html。有了这个html，我们接下来就是提取URL，当然，提取前先不着急，因为这个html里面的内容比较多，不能直接提取，那就把它简单化，先得到一个区域吧：</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 列表区域识别规则
	 * @param html 原始的html
	 * @param areaRegex 所提取区域的正则表达式
	 * @param area 正则表达式中需要提取的区域，取值是：AREA_LIST，AREA_TITLE等等
	 * @return
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> getArea<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> html, <span style="color: #003399;">String</span> areaRegex ,<span style="color: #003399;">String</span> area<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">String</span> valueHtml<span style="color: #339933;">=</span><span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">String</span> regex <span style="color: #339933;">=</span> areaRegex.<span style="color: #006633;">replaceFirst</span><span style="color: #009900;">&#40;</span>area, <span style="color: #0000ff;">&quot;([<span style="color: #000099; font-weight: bold;">\\</span><span style="color: #000099; font-weight: bold;">\\</span>s<span style="color: #000099; font-weight: bold;">\\</span><span style="color: #000099; font-weight: bold;">\\</span>S]*?)&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//		System.out.println(regex);</span>
		Pattern pattern <span style="color: #339933;">=</span> Pattern.<span style="color: #006633;">compile</span><span style="color: #009900;">&#40;</span>regex,Pattern.<span style="color: #006633;">MULTILINE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
		Matcher matcher <span style="color: #339933;">=</span> pattern.<span style="color: #006633;">matcher</span><span style="color: #009900;">&#40;</span>html<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
		<span style="color: #000000; font-weight: bold;">while</span><span style="color: #009900;">&#40;</span>matcher.<span style="color: #006633;">find</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			valueHtml <span style="color: #339933;">=</span> matcher.<span style="color: #006633;">group</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> 
		<span style="color: #000000; font-weight: bold;">return</span> valueHtml<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span></pre></div></div>

<p>有了这个域名，我就就可以提取URL列表了：</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">       <span style="color: #666666; font-style: italic;">//提取给定区域的文章列表地址,</span>
       <span style="color: #000000; font-weight: bold;">public</span> List<span style="color: #339933;">&lt;</span>String<span style="color: #339933;">&gt;</span> getListUrl<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> areaHtml,<span style="color: #003399;">String</span> regex,<span style="color: #003399;">String</span> withPrefix<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">getListUrl</span><span style="color: #009900;">&#40;</span>areaHtml, regex, withPrefix, <span style="color: #000066; font-weight: bold;">false</span>, <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 提取给定区域的文章列表地址，主要用来提取文章内的分页用的
	 * @param areaHtml 
	 * @param regex 
	 * @param withPrefix 返回的地址是否需要加一个前缀，如21cn的新闻，提取到后是没有前缀的，得加一个
	 * @param hasOmit  提取文章内分页时，是否有分页是否有省略号，如淘宝的就有。
	 * @param pageNumRegex  提取文章内的分页正则表达式
	 * @return
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> List<span style="color: #339933;">&lt;</span>String<span style="color: #339933;">&gt;</span> getListUrl<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> areaHtml,<span style="color: #003399;">String</span> regex,<span style="color: #003399;">String</span> withPrefix,<span style="color: #000066; font-weight: bold;">boolean</span> hasOmit,<span style="color: #003399;">String</span> pageNumRegex<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		List<span style="color: #339933;">&lt;</span>String<span style="color: #339933;">&gt;</span> list <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ArrayList<span style="color: #339933;">&lt;</span>String<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		regex <span style="color: #339933;">=</span> regex.<span style="color: #006633;">replaceFirst</span><span style="color: #009900;">&#40;</span>WebContent.<span style="color: #006633;">AREA_URL</span>, <span style="color: #0000ff;">&quot;(.*?)&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		Pattern pa <span style="color: #339933;">=</span> Pattern.<span style="color: #006633;">compile</span><span style="color: #009900;">&#40;</span>regex, Pattern.<span style="color: #006633;">MULTILINE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		Matcher ma <span style="color: #339933;">=</span> pa.<span style="color: #006633;">matcher</span><span style="color: #009900;">&#40;</span>areaHtml<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span>ma.<span style="color: #006633;">find</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>withPrefix <span style="color: #339933;">!=</span><span style="color: #000066; font-weight: bold;">null</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span><span style="color: #0000ff;">&quot;&quot;</span>.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span>withPrefix.<span style="color: #006633;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				list.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>withPrefix<span style="color: #339933;">+</span>ma.<span style="color: #006633;">group</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span><span style="color: #000000; font-weight: bold;">else</span><span style="color: #009900;">&#123;</span>
				list.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>ma.<span style="color: #006633;">group</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>hasOmit <span style="color: #339933;">&amp;&amp;</span> list.<span style="color: #006633;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&gt;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #003399;">String</span> lasturl <span style="color: #339933;">=</span> list.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>list.<span style="color: #006633;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			list.<span style="color: #006633;">clear</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
			regex <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;(.*?)&quot;</span><span style="color: #339933;">+</span>pageNumRegex.<span style="color: #006633;">replaceFirst</span><span style="color: #009900;">&#40;</span>WebContent.<span style="color: #006633;">PAGE_URL_NUM</span>, <span style="color: #0000ff;">&quot;(-?<span style="color: #000099; font-weight: bold;">\\</span><span style="color: #000099; font-weight: bold;">\\</span>d+)&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>			
			pa <span style="color: #339933;">=</span> Pattern.<span style="color: #006633;">compile</span><span style="color: #009900;">&#40;</span>regex<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			ma <span style="color: #339933;">=</span> pa.<span style="color: #006633;">matcher</span><span style="color: #009900;">&#40;</span>lasturl<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>ma.<span style="color: #006633;">find</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #000066; font-weight: bold;">int</span> num <span style="color: #339933;">=</span> <span style="color: #003399;">Integer</span>.<span style="color: #006633;">parseInt</span><span style="color: #009900;">&#40;</span>ma.<span style="color: #006633;">group</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #003399;">String</span> prefix <span style="color: #339933;">=</span> ma.<span style="color: #006633;">group</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #003399;">String</span> baseurl <span style="color: #339933;">=</span> prefix<span style="color: #339933;">+</span>pageNumRegex<span style="color: #339933;">;</span>
&nbsp;
				<span style="color: #000000; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> i <span style="color: #339933;">=</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;=</span> num<span style="color: #339933;">;</span> i <span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
				list.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>baseurl.<span style="color: #006633;">replaceFirst</span><span style="color: #009900;">&#40;</span>WebContent.<span style="color: #006633;">PAGE_URL_NUM</span>, i<span style="color: #339933;">+</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>			
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">return</span> list<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span></pre></div></div>

<p>以上两个函数，就可以得到文章列表及文章内分页列表。实际上有这些组合，就可以提取大部分的网站了，这里给一个例子，我的<a href="http://www.extbi.com" target="_blank">http://www.extbi.com</a>这个站点的文章就是用这个提取的。大家根据上面的讲解，好好看吧。<a href="/wp-content/uploads/WebContent.java">WebContent.java</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.voland.com.cn/common-article-collection-design-and-implementation/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

