﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-笔记-随笔分类-work</title><link>http://www.blogjava.net/yuxh/category/47628.html</link><description>way</description><language>zh-cn</language><lastBuildDate>Tue, 28 Jul 2015 18:07:06 GMT</lastBuildDate><pubDate>Tue, 28 Jul 2015 18:07:06 GMT</pubDate><ttl>60</ttl><item><title>appfuse3.5打印Hibernate sql参数</title><link>http://www.blogjava.net/yuxh/archive/2015/07/22/426376.html</link><dc:creator>yuxh</dc:creator><author>yuxh</author><pubDate>Wed, 22 Jul 2015 06:11:00 GMT</pubDate><guid>http://www.blogjava.net/yuxh/archive/2015/07/22/426376.html</guid><wfw:comment>http://www.blogjava.net/yuxh/comments/426376.html</wfw:comment><comments>http://www.blogjava.net/yuxh/archive/2015/07/22/426376.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuxh/comments/commentRss/426376.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuxh/services/trackbacks/426376.html</trackback:ping><description><![CDATA[<div style="color: #000000; font-family: 'Segoe UI'; font-size: 14.285715103149414px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 20px; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">appfuse3.5使用Hibernate4.3.6, 而Hibernate日志框架使用了jboss-logging，想在后台打出sql的参数一直无法生效。</div><div style="color: #000000; font-family: 'Segoe UI'; font-size: 14.285715103149414px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 20px; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">检查配置文件，框架里面的两个配置文件，src/test/resources/log4j2.xml（单元测试时配置），src/main/resources/log4j2.xml（运行时配置）</div><div style="color: #000000; font-family: 'Segoe UI'; font-size: 14.285715103149414px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 20px; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">搞清log4j2的配置后，各种修改（主要是</div><div style="color: #000000; font-family: 'Segoe UI'; font-size: 14.285715103149414px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 20px; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span style="font-size: 10.5pt; line-height: 1.5;">&nbsp; &lt;Logger name="org.hibernate.SQL" level="trace"/&gt;</span></div><div style="color: #000000; font-family: 'Segoe UI'; font-size: 14.285715103149414px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 20px; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span style="font-size: 10.5pt; line-height: 1.5;">&nbsp; &lt;Logger name="org.hibernate.type" level="trace"/&gt;</span>)<br />用junit测试任然无法打印出真实参数。根据这些实践，确定log4j2是使用无误生效的，只是org.hibernate这部分的logger一直未起效</div><div style="color: #000000; font-family: 'Segoe UI'; font-size: 14.285715103149414px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 20px; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">参考国内外网站，一直无人回答hibernate4的这个问题，有人指出<span style="font-size: 10.5pt; line-height: 1.5;">这部分Hibernate官方文档只是提了一句，一直未更新相关内容。最后有人提到应该是</span>&nbsp;<span style="font-size: 10.5pt; line-height: 1.5;">jboss-logging 的</span><span style="font-size: 10.5pt; line-height: 1.5;">LoggerProviders这个类的问题，看实现对log4j2已经做支持。最后发现&nbsp;</span><span style="font-size: 10.5pt; line-height: 1.5;">jboss-logging使用的是</span><span style="font-size: 10.5pt; line-height: 1.5;">3.2.0.beta，对比相关类的源代码，更改为</span><span style="font-size: 10.5pt; line-height: 1.5;">3.2.0.Final，生效！<br /><br />P.S 把这个问题提交给Appfuse官网，issue APF-1478，作者标志为4.0版本修复。</span></div><img src ="http://www.blogjava.net/yuxh/aggbug/426376.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuxh/" target="_blank">yuxh</a> 2015-07-22 14:11 <a href="http://www.blogjava.net/yuxh/archive/2015/07/22/426376.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse中项目maven依赖库错误</title><link>http://www.blogjava.net/yuxh/archive/2015/06/02/425441.html</link><dc:creator>yuxh</dc:creator><author>yuxh</author><pubDate>Tue, 02 Jun 2015 02:27:00 GMT</pubDate><guid>http://www.blogjava.net/yuxh/archive/2015/06/02/425441.html</guid><wfw:comment>http://www.blogjava.net/yuxh/comments/425441.html</wfw:comment><comments>http://www.blogjava.net/yuxh/archive/2015/06/02/425441.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuxh/comments/commentRss/425441.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuxh/services/trackbacks/425441.html</trackback:ping><description><![CDATA[新电脑装上eclipse4.4.2，导入maven项目之后，依赖库总是有很多错误。最后搜索到可能是eclipse的bug（据说是<code>JAVA_HOME没有正确传递</code>），查看到eclipse默认的是安装的jre目录，修改到jdk目录下，依赖问题解决。<br />不过目前版本仍然没有解决pom文件的&#8220;Plugin execution not covered by lifecycle configuration&#8221;错误，暂时忽略不管吧。<img src ="http://www.blogjava.net/yuxh/aggbug/425441.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuxh/" target="_blank">yuxh</a> 2015-06-02 10:27 <a href="http://www.blogjava.net/yuxh/archive/2015/06/02/425441.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA调用重写的祖父方法</title><link>http://www.blogjava.net/yuxh/archive/2012/05/31/379647.html</link><dc:creator>yuxh</dc:creator><author>yuxh</author><pubDate>Thu, 31 May 2012 03:23:00 GMT</pubDate><guid>http://www.blogjava.net/yuxh/archive/2012/05/31/379647.html</guid><wfw:comment>http://www.blogjava.net/yuxh/comments/379647.html</wfw:comment><comments>http://www.blogjava.net/yuxh/archive/2012/05/31/379647.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuxh/comments/commentRss/379647.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuxh/services/trackbacks/379647.html</trackback:ping><description><![CDATA[本打算继承一个API中的Parent类（Parent继承自GrandParent类），重写其中的service方法，copy了Parent的service方法。不过发现Parent的service中也有super.service方法。当时考虑直接调用GrandParent的service方法。。。未遂（包括反射也不行）。正好看到老外写的一篇文章，翻译：<br />在Son类里面写一个test方法：<br /> <div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;test()&nbsp;{<br />&nbsp;</span><span style="color: #0000FF; ">super</span><span style="color: #000000; ">.test();<br />&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.test();<br />}<br />反编译之后：<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;test()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;0:aload_0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;1:invokespecial&nbsp;&nbsp;&nbsp;#2&nbsp;&nbsp;&nbsp;&lt;Method&nbsp;void&nbsp;Parent.test()&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;4:aload_0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;5:invokevirtual&nbsp;&nbsp;&nbsp;#3&nbsp;&nbsp;&nbsp;&lt;Method&nbsp;void&nbsp;test()&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;8:return&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>使用ASM可以完成对GrandParent方法的调用<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;GrandParent&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;test()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">test&nbsp;of&nbsp;GrandParent</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Parent&nbsp;</span><span style="color: #0000FF; ">extends</span><span style="color: #000000; ">&nbsp;GrandParent{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;test()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">test&nbsp;of&nbsp;Parent</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Son&nbsp;</span><span style="color: #0000FF; ">extends</span><span style="color: #000000; ">&nbsp;Parent{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;test()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">test&nbsp;of&nbsp;Son</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</span></div>调用Son实例的test方法只会执行Son的test方法。而ASM可以修改class，先写一个Example类继承Son，重写test方法<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.io.FileOutputStream;<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">&nbsp;<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;org.objectweb.asm.ClassWriter;<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;org.objectweb.asm.MethodVisitor;<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;org.objectweb.asm.Opcodes;<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;ASMByteCodeManipulation&nbsp;</span><span style="color: #0000FF; ">extends</span><span style="color: #000000; ">&nbsp;ClassLoader&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;Opcodes&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main(String&nbsp;args[])&nbsp;</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;Exception&nbsp;{<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;ClassWriter&nbsp;cw&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ClassWriter(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;cw.visit(V1_1,&nbsp;ACC_PUBLIC,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Example</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Son</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;creates&nbsp;a&nbsp;MethodWriter&nbsp;for&nbsp;the&nbsp;(implicit)&nbsp;constructor</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;MethodVisitor&nbsp;mw&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cw.visitMethod(ACC_PUBLIC,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&lt;init&gt;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">()V</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">,</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;mw.visitVarInsn(ALOAD,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;mw.visitMethodInsn(INVOKESPECIAL,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Son</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&lt;init&gt;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">()V</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;mw.visitInsn(RETURN);<br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;mw.visitMaxs(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;mw.visitEnd();<br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;<br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;creates&nbsp;a&nbsp;MethodWriter&nbsp;for&nbsp;the&nbsp;'test'&nbsp;method</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;mw&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cw.visitMethod(ACC_PUBLIC,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">test</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">()V</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;mw.visitFieldInsn(GETSTATIC,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">java/lang/System</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">out</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Ljava/io/PrintStream;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;mw.visitLdcInsn(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">test&nbsp;of&nbsp;AI3</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;mw.visitMethodInsn(INVOKEVIRTUAL,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">java/io/PrintStream</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">println</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,<br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">(Ljava/lang/String;)V</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">Call&nbsp;test()&nbsp;of&nbsp;GrandParent</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;mw.visitVarInsn(ALOAD,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;mw.visitMethodInsn(INVOKESPECIAL,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">GrandParent</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">test</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">()V</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">Call&nbsp;test()&nbsp;of&nbsp;GrandParent</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;mw.visitVarInsn(ALOAD,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;mw.visitMethodInsn(INVOKESPECIAL,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Parent</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">test</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">()V</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">Call&nbsp;test()&nbsp;of&nbsp;GrandParent</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;mw.visitVarInsn(ALOAD,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;mw.visitMethodInsn(INVOKESPECIAL,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Son</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">test</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">()V</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;mw.visitInsn(RETURN);<br /></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;mw.visitMaxs(</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;mw.visitEnd();<br /></span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #000000; ">&nbsp;<br /></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">byte</span><span style="color: #000000; ">[]&nbsp;code&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cw.toByteArray();<br /></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;FileOutputStream&nbsp;fos&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;FileOutputStream(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Example.class</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;fos.write(code);<br /></span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;fos.close();<br /></span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #000000; ">&nbsp;<br /></span><span style="color: #008080; ">45</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;ASMByteCodeManipulation&nbsp;loader&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ASMByteCodeManipulation();<br /></span><span style="color: #008080; ">46</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;Class</span><span style="color: #000000; ">&lt;?&gt;</span><span style="color: #000000; ">&nbsp;exampleClass&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;loader.defineClass(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Example</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;code,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,<br /></span><span style="color: #008080; ">47</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;code.length);<br /></span><span style="color: #008080; ">48</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;Object&nbsp;obj&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;exampleClass.newInstance();<br /></span><span style="color: #008080; ">49</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;exampleClass.getMethod(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">test</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">).invoke(obj,&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">50</span>&nbsp;<span style="color: #000000; ">&nbsp;<br /></span><span style="color: #008080; ">51</span>&nbsp;<span style="color: #000000; ">&nbsp;}<br /></span><span style="color: #008080; ">52</span>&nbsp;<span style="color: #000000;">}</span></div>输出：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">test&nbsp;of&nbsp;AI3<br />test&nbsp;of&nbsp;GrandParent<br />test&nbsp;of&nbsp;Parent<br />test&nbsp;of&nbsp;Son</span></div>看看怎样实现的，11行定义一个新的类Example继承Son。22行，Example重写test方法，先打印&#8220;test of  AI3&#8221;，再分别在29、32、35行调用<span style="color: #000000; ">GrandParent、Parent、Son的test方法。</span><div></div><div>&nbsp;main方法中，45行创建Example的实例，再用反射调他的test方法。<br />使用invokespecial这种方式也有局限，只能从子类调用。否则报错：<div><strong>Exception in thread "main" java.lang.VerifyError: (class: Example,  method: test1 signature: (LAI2;)V) Illegal use of nonvirtual function  call</strong></div></div><img src ="http://www.blogjava.net/yuxh/aggbug/379647.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuxh/" target="_blank">yuxh</a> 2012-05-31 11:23 <a href="http://www.blogjava.net/yuxh/archive/2012/05/31/379647.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Builder模式</title><link>http://www.blogjava.net/yuxh/archive/2012/05/30/379576.html</link><dc:creator>yuxh</dc:creator><author>yuxh</author><pubDate>Wed, 30 May 2012 09:44:00 GMT</pubDate><guid>http://www.blogjava.net/yuxh/archive/2012/05/30/379576.html</guid><wfw:comment>http://www.blogjava.net/yuxh/comments/379576.html</wfw:comment><comments>http://www.blogjava.net/yuxh/archive/2012/05/30/379576.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuxh/comments/commentRss/379576.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuxh/services/trackbacks/379576.html</trackback:ping><description><![CDATA[使用Google calendar v3 API的时候，大量发现Builder使用。比如Credential类，查了查Builder模式的讲解，始终感觉代码的实现和标准定义不太相同。最后发现这种实现方式是《Effective java 2nd》中的一种实现(Item 2: Consider a builder when faced with many constructor parameters)。静态工厂和构造器都有一个通病：对于存在大量可选构造参数的对象，扩展性不好。经典的解决方案是提供多个构造函数，第一个构造函数只有必须的参数，第二个构造函数除了必须参数还有一个可选参数，第三个除了必须参数还有两个可选参数。。。这样下去知道最后一个可选参数出现（<em>telescoping constructor</em>）。这种方案的问题是，当构建对象的时候很容易把其中两个参数的位置放反。。。。<span style="color: red;">（难发现的bug）</span>。 <br /><div>另一种解决方案是JavaBean 模式，先调用无参构造函数再调用各个set方法来组装对象。这种方案的问题是不能强制一致性。如果没有set某些必须的参数的话，对象可能处于不一致（<div>inconsistent）的状态<span style="color: red;">（难发现的bug）</span>。另外一个缺点是JavaBean模式不能让类immutable，需要程序员额外工作保证线程安全。</div>第三种方式就是Builder设计模式。这种方式混合了<em>telescoping constructor</em>模式的安全性和JavaBean模式的可读性。客户端调用有所有必填参数的构造器（或静态工厂），得到一个builder对象。然后调用builder对象的方法去set各个选填参数。最后调用无参的build方法产生一个immutable的对象实例。immutable对象有非常多优点而且可能很有用。builder的set方法都是返回builder本身，所以调用也是可以chained。如：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;&nbsp;GoogleCredential&nbsp;credentialNew&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.setJsonFactory(JSON_FACTORY).setClientSecrets(clientSecrets)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.addRefreshListener(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;CredentialStoreRefreshListener(userID,&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;DBCredentialStore())).build()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.setAccessToken(accessToken).setRefreshToken(refreshToken)</span></div>客户端代码很好写，更重要的是易读。Builder模式模拟了在Ada和Python语言里的命名可选参数（<em>named optional parameters</em>）。<br />同时Builder类设置为static也是对Item 22：Favor static member classes over nonstatic的实践</div><img src ="http://www.blogjava.net/yuxh/aggbug/379576.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuxh/" target="_blank">yuxh</a> 2012-05-30 17:44 <a href="http://www.blogjava.net/yuxh/archive/2012/05/30/379576.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Google Calendar v3授权传参数</title><link>http://www.blogjava.net/yuxh/archive/2012/05/08/377592.html</link><dc:creator>yuxh</dc:creator><author>yuxh</author><pubDate>Tue, 08 May 2012 03:40:00 GMT</pubDate><guid>http://www.blogjava.net/yuxh/archive/2012/05/08/377592.html</guid><wfw:comment>http://www.blogjava.net/yuxh/comments/377592.html</wfw:comment><comments>http://www.blogjava.net/yuxh/archive/2012/05/08/377592.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuxh/comments/commentRss/377592.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuxh/services/trackbacks/377592.html</trackback:ping><description><![CDATA[以典型的客户端-服务器端授权为例<br />一 基本流程<br />使用Google Calendar v3 ，如果以servlet作为代理，可以使用官方示例,自己写一个类A.java继承AbstractAuthorizationCodeServlet类，这个类主要用于跳转到google提供的授权页面，如果用户同意授权，则根据A类中的URL（这个必须和注册的google 回调路径相同，比如oauth_callback否则报错）重定向到B类，B.java 继承AbstractAuthorizationCodeCallbackServlet类，这个访问路径类似http://www.example.com/oauth_callback?code=ABC1234。这里我配置oauth_callback为servlet的访问路径，B类中的<div>onSuccess方法将根据获得的access Token（这是根据传过来的code获得的）做业务操作。</div><br />二 需要参数的情况<br />有些业务需要用户传参数，<span style="background-color: yellow;">直接传参数给A，再试图在B中获取是不行的</span>！B类中只能获取某些<span style="background-color: yellow;">固定</span>的参数，如code。要想传用户参数，我们可以在A中先获取，把几个参数组装为json格式字符串（还可以继续base64编码），把这个字符串作为state的值，再重定向到授权页面，同意后state参数可以传到B类，取值解析json字符串（或先base64解码），得到参数。<br />由于API中AuthorizationCodeRequestUrl有处理state的方法，而AbstractAuthorizationCodeServlet已经直接封装，为了使用setState，直接在A类中继承HttpServlet重写service方法，复制大部分AbstractAuthorizationCodeServlet的内容，稍作修改：<br /><div>resp.sendRedirect(flow.newAuthorizationUrl()<span style="color: red;">.setState(json)</span>.setRedirectUri(redirectUri).build());<br /><br />三 关于refresh token<br />默认情况下，用户授权之后token会有一个小时的有效期，之后你可以通过refresh token再重新获取token。所以，如果不需要用户再次授权，可以在第一次，保存好token、refresh token、ExpirationTime。实例中用了JDO来实现，自己如果使用数据库保存，可类似写一个类实现CredentialStore类。使用的时候，现在数据库中取出，再创建credential，如：<br /><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GoogleCredential credentialNew = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .setJsonFactory(JSON_FACTORY).setClientSecrets(clientSecrets)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .addRefreshListener(new CredentialStoreRefreshListener(userID, new DBCredentialStore())).build()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .setAccessToken(accessToken).setRefreshToken(refreshToken)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .setExpirationTimeMilliseconds(expirationTimeMilliseconds);<br />在无效的情况下，Listener会自动去用refresh token请求。</div></div><img src ="http://www.blogjava.net/yuxh/aggbug/377592.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuxh/" target="_blank">yuxh</a> 2012-05-08 11:40 <a href="http://www.blogjava.net/yuxh/archive/2012/05/08/377592.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GSON简单处理JSON</title><link>http://www.blogjava.net/yuxh/archive/2012/05/08/377588.html</link><dc:creator>yuxh</dc:creator><author>yuxh</author><pubDate>Tue, 08 May 2012 02:23:00 GMT</pubDate><guid>http://www.blogjava.net/yuxh/archive/2012/05/08/377588.html</guid><wfw:comment>http://www.blogjava.net/yuxh/comments/377588.html</wfw:comment><comments>http://www.blogjava.net/yuxh/archive/2012/05/08/377588.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuxh/comments/commentRss/377588.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuxh/services/trackbacks/377588.html</trackback:ping><description><![CDATA[json格式经常需要用到，google提供了一个处理json的项目：GSON，能很方便的处理转换java对象和JSON表达。他不需要使用annotation，也不需要对象的源代码就能使用。<br />以字符串为例介绍：<br />1 。构造json 字符串<br />&nbsp; 例如要传送json格式的字符串<br /><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; String appID = req.getParameter("appID");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String userID&nbsp; = req.getParameter("userID");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map map = new HashMap();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.put("appID", appID);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.put("userID", userID);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Gson gson = new Gson();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String state = gson.toJson(map);</div>2.解析json字符串<br /><div>&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; JsonParser jsonparer = new JsonParser();//初始化解析json格式的对象<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; String state = req.getParameter("state");<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; String appID = jsonparer.parse(state).getAsJsonObject().get("appID").getAsString();<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; String userID = jsonparer.parse(state).getAsJsonObject().get("userID").getAsString();</div><img src ="http://www.blogjava.net/yuxh/aggbug/377588.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuxh/" target="_blank">yuxh</a> 2012-05-08 10:23 <a href="http://www.blogjava.net/yuxh/archive/2012/05/08/377588.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java时区处理</title><link>http://www.blogjava.net/yuxh/archive/2012/03/15/371982.html</link><dc:creator>yuxh</dc:creator><author>yuxh</author><pubDate>Thu, 15 Mar 2012 15:08:00 GMT</pubDate><guid>http://www.blogjava.net/yuxh/archive/2012/03/15/371982.html</guid><wfw:comment>http://www.blogjava.net/yuxh/comments/371982.html</wfw:comment><comments>http://www.blogjava.net/yuxh/archive/2012/03/15/371982.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuxh/comments/commentRss/371982.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuxh/services/trackbacks/371982.html</trackback:ping><description><![CDATA[<div><div>通用协调时(UTC, Universal Time Coordinated)，格林尼治平均时(GMT, Greenwich Mean Time) 由于历史原因，这两个时间是一样的。<div>北京时区是东八区，领先UTC八个小时，在电子邮件信头的Date域记为+0800。<div>转换中，最重要的公式就是：<br />UTC ＋ 时区差 ＝ 本地时间</div></div></div></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;Calendar&nbsp;convertToGmt(Calendar&nbsp;cal)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;date&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cal.getTime();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TimeZone&nbsp;tz&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cal.getTimeZone();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">input&nbsp;calendar&nbsp;has&nbsp;date&nbsp;[</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;date&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">]</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Returns&nbsp;the&nbsp;number&nbsp;of&nbsp;milliseconds&nbsp;since&nbsp;January&nbsp;1,&nbsp;1970,&nbsp;00:00:00 GMT<br />
</span><span style="color: #008000; "></span><span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;msFromEpochGmt&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;date.getTime();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;gives&nbsp;you&nbsp;the&nbsp;current&nbsp;offset&nbsp;in&nbsp;ms&nbsp;from&nbsp;GMT&nbsp;at&nbsp;the&nbsp;current&nbsp;date</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;offsetFromUTC&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;tz.getOffset(msFromEpochGmt);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">offset&nbsp;is&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;offsetFromUTC);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;create&nbsp;a&nbsp;new&nbsp;calendar&nbsp;in&nbsp;GMT&nbsp;timezone,&nbsp;set&nbsp;to&nbsp;this&nbsp;date&nbsp;and&nbsp;add&nbsp;the offset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000; "></span><span style="color: #008000; "></span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Calendar&nbsp;gmtCal&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Calendar.getInstance(TimeZone.getTimeZone(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">GMT</span><span style="color: #000000; ">"</span><span style="color: #000000; ">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Calendar&nbsp;utcCal&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Calendar.getInstance(TimeZone.getTimeZone(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">UTC</span><span style="color: #000000; ">"</span><span style="color: #000000; ">));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gmtCal.setTime(date);<br /><div>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #000000; ">//根据东西时区，选择offsetFromUTC为正或负数</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gmtCal.add(Calendar.MILLISECOND,&nbsp;offsetFromUTC);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;utcCal.setTime(date);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;utcCal.add(Calendar.MILLISECOND,&nbsp;offsetFromUTC);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Created&nbsp;GMT&nbsp;cal&nbsp;with&nbsp;date&nbsp;[</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;gmtCal.getTime()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">==</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;utcCal.getTime()&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">]</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000;">&nbsp;gmtCal;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span></div><img src ="http://www.blogjava.net/yuxh/aggbug/371982.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuxh/" target="_blank">yuxh</a> 2012-03-15 23:08 <a href="http://www.blogjava.net/yuxh/archive/2012/03/15/371982.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Andriod webview实现文件上传</title><link>http://www.blogjava.net/yuxh/archive/2012/03/12/371715.html</link><dc:creator>yuxh</dc:creator><author>yuxh</author><pubDate>Mon, 12 Mar 2012 04:54:00 GMT</pubDate><guid>http://www.blogjava.net/yuxh/archive/2012/03/12/371715.html</guid><wfw:comment>http://www.blogjava.net/yuxh/comments/371715.html</wfw:comment><comments>http://www.blogjava.net/yuxh/archive/2012/03/12/371715.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/yuxh/comments/commentRss/371715.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuxh/services/trackbacks/371715.html</trackback:ping><description><![CDATA[<div>
<div>Andriod 到3.2版本为止，webview方式下使用&lt;input type="file" /&gt;点击后都没有反应。实际上顶层是有隐含的接口没实现的，可以自己重写这个方法来实现。以phonegap为例：<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;App&nbsp;</span><span style="color: #0000FF; ">extends</span><span style="color: #000000; ">&nbsp;DroidGap&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;ValueCallback</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Uri</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;mUploadMessage;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;FILECHOOSER_RESULTCODE&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; ">&nbsp;Called&nbsp;when&nbsp;the&nbsp;activity&nbsp;is&nbsp;first&nbsp;created.&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;onCreate(Bundle&nbsp;savedInstanceState)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">super</span><span style="color: #000000; ">.onCreate(savedInstanceState);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">super</span><span style="color: #000000; ">.init();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;WebView&nbsp;wv&nbsp;=&nbsp;new&nbsp;WebView(this);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;wv.setWebViewClient(new&nbsp;WebViewClient());</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.appView.setWebChromeClient(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;CordovaChromeClient(App.</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;For&nbsp;Android&nbsp;3.0+</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;openFileChooser(ValueCallback</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Uri</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;uploadMsg,&nbsp;String&nbsp;acceptType)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mUploadMessage&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;uploadMsg;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Intent&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Intent(Intent.ACTION_GET_CONTENT);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i.addCategory(Intent.CATEGORY_OPENABLE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i.setType(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">image/*</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;App.</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.startActivityForResult(Intent.createChooser(i,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">File&nbsp;Chooser</span><span style="color: #000000; ">"</span><span style="color: #000000;">),&nbsp;FILECHOOSER_RESULTCODE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;The&nbsp;undocumented&nbsp;magic&nbsp;method&nbsp;override<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Eclipse&nbsp;will&nbsp;swear&nbsp;at&nbsp;you&nbsp;if&nbsp;you&nbsp;try&nbsp;to&nbsp;put&nbsp;@Override&nbsp;here</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;openFileChooser(ValueCallback</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Uri</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;uploadMsg)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mUploadMessage&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;uploadMsg;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Intent&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Intent(Intent.ACTION_GET_CONTENT);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i.addCategory(Intent.CATEGORY_OPENABLE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i.setType(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">image/*</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;App.</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.startActivityForResult(Intent.createChooser(i,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">File&nbsp;Chooser</span><span style="color: #000000; ">"</span><span style="color: #000000; ">),&nbsp;App.FILECHOOSER_RESULTCODE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;setContentView(wv);</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">super</span><span style="color: #000000; ">.loadUrl(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">file:///android_asset/www/login.html</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">protected</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;onActivityResult(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;requestCode,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;resultCode,&nbsp;Intent&nbsp;intent)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(requestCode&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;FILECHOOSER_RESULTCODE)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;mUploadMessage)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uri&nbsp;result&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;intent&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">||</span><span style="color: #000000; ">&nbsp;resultCode&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;RESULT_OK&nbsp;</span><span style="color: #000000; ">?</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">&nbsp;:&nbsp;intent.getData();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mUploadMessage.onReceiveValue(result);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mUploadMessage&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
</div>
</div>
如果直接的webview方式，extends  WebChromeClient即可。
参考：http://stackoverflow.com/questions/5907369/file-upload-in-webview
<img src ="http://www.blogjava.net/yuxh/aggbug/371715.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuxh/" target="_blank">yuxh</a> 2012-03-12 12:54 <a href="http://www.blogjava.net/yuxh/archive/2012/03/12/371715.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简单google weather调用（jsp实现）</title><link>http://www.blogjava.net/yuxh/archive/2012/02/22/370477.html</link><dc:creator>yuxh</dc:creator><author>yuxh</author><pubDate>Wed, 22 Feb 2012 00:58:00 GMT</pubDate><guid>http://www.blogjava.net/yuxh/archive/2012/02/22/370477.html</guid><wfw:comment>http://www.blogjava.net/yuxh/comments/370477.html</wfw:comment><comments>http://www.blogjava.net/yuxh/archive/2012/02/22/370477.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuxh/comments/commentRss/370477.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuxh/services/trackbacks/370477.html</trackback:ping><description><![CDATA[weather.jsp:<br /><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&lt;%</span><span style="color: #000000; ">@&nbsp;page&nbsp;language</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">java</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;contentType</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">text/html;&nbsp;charset=UTF-8</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;pageEncoding</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">UTF-8</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%&gt;</span><span style="color: #000000; "><br /></span><span style="color: #000000; ">&lt;%</span><span style="color: #000000; ">@&nbsp;page&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">java.io.*,java.net.*</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%&gt;</span><span style="color: #000000; "><br /></span><span style="color: #000000; ">&lt;%</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;sbf&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;StringBuffer();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">Access&nbsp;the&nbsp;page</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">如果网络设置了代理</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.setProperty(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">http.proxyHost</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">xxx</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.setProperty(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">http.proxyPort</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">80</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URL&nbsp;url&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;URL(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">http://www.google.com/ig/api?weather=london</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URLConnection&nbsp;urlConn&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;url.openConnection();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;in&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;BufferedReader(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;InputStreamReader(urlConn.getInputStream()));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;inputLine;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;((inputLine&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;in.readLine())&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbf.append(inputLine);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">last=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">sbf.toString());<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(MalformedURLException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">MalformedURLException</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">e);<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(IOException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">IOException</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">e);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #000000; ">%&gt;&lt;%=</span><span style="color: #000000; ">sbf.toString()</span><span style="color: #000000;">%&gt;<br />前台js部分：<br /><br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">var</span><span style="color: #000000; ">&nbsp;childData&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">function</span><span style="color: #000000; ">(selector,&nbsp;arg)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;selector.find(arg).attr('data');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$.ajax({<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type&nbsp;:&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">GET</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data&nbsp;:&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">where=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url&nbsp;:&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">weather.jsp</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;success&nbsp;:&nbsp;</span><span style="color: #0000FF; ">function</span><span style="color: #000000; ">(data)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.debug('data</span><span style="color: #000000; ">=</span><span style="color: #000000; ">'</span><span style="color: #000000; ">+</span><span style="color: #000000; ">data);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;forecast&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;$(data).find('forecast_information');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cCondition&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;$(data).find('current_conditions');<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;city&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;childData(forecast,&nbsp;'city');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(city&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;undefined)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;date&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;childData(forecast,&nbsp;'forecast_date');<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;condition&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;childData(cCondition,&nbsp;'condition');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempC&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;childData(cCondition,&nbsp;'temp_c');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;humidity&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;childData(cCondition,&nbsp;'humidity');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;icon&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;childData(cCondition,&nbsp;'icon');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$('#city').text(city);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$('#date').text(date);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$('#condition').text(condition);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$('#tempC').html(tempC&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;'</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">deg;&nbsp;C');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$('#humidity').text(humidity);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$('#icon').attr({<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'src'&nbsp;:&nbsp;'http:</span><span style="color: #008000; ">//</span><span style="color: #008000; ">www.google.com'&nbsp;+&nbsp;icon</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$('#data').stop().show('fast');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$('#error').stop().show('fast');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});</span></div></div></div><img src ="http://www.blogjava.net/yuxh/aggbug/370477.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuxh/" target="_blank">yuxh</a> 2012-02-22 08:58 <a href="http://www.blogjava.net/yuxh/archive/2012/02/22/370477.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>区分getPath(), getAbsolutePath(), getCanonicalPath()</title><link>http://www.blogjava.net/yuxh/archive/2011/06/24/352951.html</link><dc:creator>yuxh</dc:creator><author>yuxh</author><pubDate>Fri, 24 Jun 2011 05:42:00 GMT</pubDate><guid>http://www.blogjava.net/yuxh/archive/2011/06/24/352951.html</guid><wfw:comment>http://www.blogjava.net/yuxh/comments/352951.html</wfw:comment><comments>http://www.blogjava.net/yuxh/archive/2011/06/24/352951.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuxh/comments/commentRss/352951.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuxh/services/trackbacks/352951.html</trackback:ping><description><![CDATA[<div><p>来自<div>http://stackoverflow.com/questions/1099300/whats-the-difference-between-getpath-getabsolutepath-and-getcanonicalpath</div><br /></p><p>C:\temp\file.txt" - this is a path, an absolute path, a canonical path</p>  <p>.\file.txt This is a path, It's not an absolute path nor canonical path.</p>  <p><code>C:\temp\myapp\bin\..\\..\file.txt</code> This is a path, and an absolute path, it's not a canonical path</p>  <p>Canonical path is always an absolute path.</p></div><div>Converting from a path to a canonical path makes it absolute (通常会处理改变当前目录，所以像. ./file.txt 变为c:/temp/file.txt). The  canonical path of a file just "purifies" the  path, 去除和解析类似&#8220; ..\&#8221; and resolving symlinks(on  unixes)</div><div><div><p>In short:</p>  <ul><li>getPath() gets the path string that the File object was constructed with, and it may be relative current directory.</li><li>getAbsolutePath() gets the path string after resolving it against  the current directory if it's relative, resulting in a fully qualified  path.</li><li>getCanonicalPath() gets the path string after resolving any relative  path against current directory, and removes any relative pathing (. and  ..), and any file system links to return a path which the file system  considers the canonical means to reference the file system object to  which it points.</li></ul>  <p>Also, each of this has a File equivalent which returns the corresponding File object.</p> </div></div><div><p>The best way I have found to get a feel for things like this is to try them out:</p>  <pre prettyprint=""><code>import java.io.File;<br />public class PathTesting {<br />&nbsp; &nbsp; &nbsp; &nbsp; public static void main(String [] args) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; File f = new File("test/.././file.txt");<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(f.getPath());<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(f.getAbsolutePath());<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(f.getCanonicalPath());<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; catch(Exception e) {}<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />}<br /></code></pre>  <p>Your output will be something like:</p>  <pre prettyprint=""><code>test\..\.\file.txt<br />C:\projects\sandbox\trunk\test\..\.\file.txt<br />C:\projects\sandbox\trunk\file.txt<br /></code></pre>  <p>So, <code>getPath()</code> gives you the path based on the File object, which may or may not be relative; <code>getAbsolutePath()</code> gives you an absolute path to the file; and <code>getCanonicalPath()</code>  gives you the unique absolute path to the file. Notice that there are a  huge number of absolute paths that point to the same file, but only one  canonical path.</p>  When to use each? Depends on what you're trying to accomplish, but if you were trying to see if two <code>Files</code> are pointing at the same file on disk, you could compare their canonical paths.</div><img src ="http://www.blogjava.net/yuxh/aggbug/352951.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuxh/" target="_blank">yuxh</a> 2011-06-24 13:42 <a href="http://www.blogjava.net/yuxh/archive/2011/06/24/352951.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>路径斜杠处理</title><link>http://www.blogjava.net/yuxh/archive/2011/06/15/352358.html</link><dc:creator>yuxh</dc:creator><author>yuxh</author><pubDate>Wed, 15 Jun 2011 06:47:00 GMT</pubDate><guid>http://www.blogjava.net/yuxh/archive/2011/06/15/352358.html</guid><wfw:comment>http://www.blogjava.net/yuxh/comments/352358.html</wfw:comment><comments>http://www.blogjava.net/yuxh/archive/2011/06/15/352358.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuxh/comments/commentRss/352358.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuxh/services/trackbacks/352358.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/yuxh/archive/2011/06/15/352358.html'>阅读全文</a><img src ="http://www.blogjava.net/yuxh/aggbug/352358.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuxh/" target="_blank">yuxh</a> 2011-06-15 14:47 <a href="http://www.blogjava.net/yuxh/archive/2011/06/15/352358.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>