﻿<?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-重剑无锋</title><link>http://www.blogjava.net/morgan/</link><description /><language>zh-cn</language><lastBuildDate>Wed, 17 Jun 2026 12:37:18 GMT</lastBuildDate><pubDate>Wed, 17 Jun 2026 12:37:18 GMT</pubDate><ttl>60</ttl><item><title>bat 脚本学习</title><link>http://www.blogjava.net/morgan/articles/bat.html</link><dc:creator>morgan</dc:creator><author>morgan</author><pubDate>Mon, 17 Sep 2012 15:18:00 GMT</pubDate><guid>http://www.blogjava.net/morgan/articles/bat.html</guid><wfw:comment>http://www.blogjava.net/morgan/comments/387946.html</wfw:comment><comments>http://www.blogjava.net/morgan/articles/bat.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/morgan/comments/commentRss/387946.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/morgan/services/trackbacks/387946.html</trackback:ping><description><![CDATA[&nbsp; &nbsp; &nbsp; &nbsp; 做windchill克制化的时候，部署代码很复杂，需要根据情况执行很多命令，所以通过bat批处理可以有效避免。bat批处理就是一条一条的命令。轻巧灵活，功能强大，如下记录一些常用的用法。<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; @echo off<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 不回显命令。<br />&nbsp; &nbsp; &nbsp; &nbsp; echo&nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 显示后面的字符串<br />&nbsp; &nbsp; &nbsp; &nbsp; if&nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if 1==1 echo helloworld &nbsp;判断1==1是否成立，如果成立，则显示helloworld。<br />&nbsp; &nbsp; &nbsp; &nbsp; for<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1 &nbsp;for %%i in (t*.*) do echo %%i &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;显示当前文件夹下以t开头的文件。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2 &nbsp;for /d %%i in (c*.*) do echo %%i &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;显示当前文件夹下以c开头的文件夹。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;3 &nbsp;for /r d:\ %%i in (c*.*) do echo %%i &nbsp; &nbsp; &nbsp; 显示D盘下以及子文件夹下所有以C开头的文件。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;4 &nbsp;for /r /d %%i in (c*.*) do echo %%i &nbsp; &nbsp; &nbsp; &nbsp; 显示D盘下以及子文件夹下面所有以C开头的文件夹。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;5 &nbsp;for /L %%i in (1,1,5) do echo %%i &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 显示以1开始，5结束，step为1的序列。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;6 &nbsp;for /f %%i in (a.txt) do echo %%i &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;显示a.txt文件中的所有内容 &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;6 &nbsp;for /f "tokens=4,* delims=\" %%i in (a.txt) do echo %%i\%%j &gt;&gt; b.txt<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 读取当前目录下a.txt文件中的内容，并且每行以\分割，最后返回第四列以及以后每一列的内容，全部写入到b.txt文件中。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;7 &nbsp;for /r d:\project\src %%i in (*.java) do javac %%i 2&gt;&gt;temp.log<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 编译d:\project\src目录下面所有的java文件，并且编译信息输出到temp.log目录。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; del&nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; del a.txt &nbsp; &nbsp; 删除当前目录下的a.txt文件。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;del %0 &nbsp; &nbsp; &nbsp; 删除当前的批处理文件。<br />&nbsp; &nbsp; &nbsp; &nbsp; &gt; &gt;&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &gt; 将内容输出到后面的文件。覆盖之前的内容。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &gt;&gt; 将前面命令的内容写到后面的文件，但是写入的方式是追加写入。不覆盖之前的内容。&nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; |<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 将前一个命令的输出内容作为后一个命令的输入。&nbsp; &nbsp; &nbsp;&nbsp;<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; 以上都是基础内容，但是掌握好以后，写一个病毒程序出来已经完全没问题了。更深入的使用请研究<span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">Bat.Worm.Muma</span>&nbsp;病毒代码，此代码构思精巧，<br />&nbsp;不得不佩服此病毒的作者。在此致敬。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<img src ="http://www.blogjava.net/morgan/aggbug/387946.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/morgan/" target="_blank">morgan</a> 2012-09-17 23:18 <a href="http://www.blogjava.net/morgan/articles/bat.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>windchill 10.0 性能优化</title><link>http://www.blogjava.net/morgan/articles/387673.html</link><dc:creator>morgan</dc:creator><author>morgan</author><pubDate>Thu, 13 Sep 2012 11:23:00 GMT</pubDate><guid>http://www.blogjava.net/morgan/articles/387673.html</guid><wfw:comment>http://www.blogjava.net/morgan/comments/387673.html</wfw:comment><comments>http://www.blogjava.net/morgan/articles/387673.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/morgan/comments/commentRss/387673.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/morgan/services/trackbacks/387673.html</trackback:ping><description><![CDATA[&nbsp; &nbsp; &nbsp; &nbsp; 目前的项目需要做windchill10.0系统的优化工作，经过整理，现在罗列如下<br />&nbsp; &nbsp; &nbsp; &nbsp; 一 在site.xconf文件中添加如下内容：<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1 &lt;Property name="wt.org.services.userPasswordChangeEnabled" overridable="true" targetFile="codebase/wt.properties" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value="true"/&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 允许用户修改密码的功能<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2 &nbsp;&lt;Property name="wt.manager.monitor.services" overridable="true" targetFile="codebase/wt.properties" value="MethodServer &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BackgroundMethodServer"/&gt;<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;Property name="wt.queue.executeQueues" overridable="true" targetFile="codebase/wt.properties" value="false"/&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;Property name="wt.manager.monitor.start.MethodServer" overridable="true" targetFile="codebase/wt.properties" value="3"/&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;Property name="wt.manager.monitor.start.BackgroundMethodServer" overridable="true" targetFile="codebase/wt.properties" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value="2"/&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 定义后台方法服务器，并将队列的执行转移到后台方法服务器上。同时定义了方法服务器和后台方法服务器的个数。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3&nbsp;&nbsp;&lt;Property name="wt.method.maxHeap" overridable="true" targetFile="codebase/wt.properties" value="3072"/&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;Property name="wt.method.minHeap" overridable="true" targetFile="codebase/wt.properties" value="3072"/&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;Property name="wt.manager.maxHeap" overridable="true" targetFile="codebase/wt.properties" value="512"/&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;Property name="wt.manager.minHeap" overridable="true" targetFile="codebase/wt.properties" value="512"/&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 定义了后台方法服务器最大堆大小，最小堆大小，服务器管理器最大堆大小和最小堆大小。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4 &nbsp;保存site.xconf文件，在windchill shell中执行 xconfmanager -p 命令。<br />&nbsp; &nbsp; &nbsp; &nbsp; 二 &nbsp;tomcat内存优化<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1 使用编辑器打开&lt;WT_HOME&gt;\tomcat\bin\wttomcat_start.bat文件。修改-Xms和-Xmx参数值为-Xms4096M -Xmx4096M<br />&nbsp; &nbsp; &nbsp; &nbsp; 三 &nbsp;重新启动windchill服务器，在windchill shell中输入windchill stop &amp; windchill start。<br /><br /><br /></div><img src ="http://www.blogjava.net/morgan/aggbug/387673.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/morgan/" target="_blank">morgan</a> 2012-09-13 19:23 <a href="http://www.blogjava.net/morgan/articles/387673.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>软件开发的基本方法---读软件工程思想(林锐)有感</title><link>http://www.blogjava.net/morgan/articles/method.html</link><dc:creator>morgan</dc:creator><author>morgan</author><pubDate>Thu, 13 Sep 2012 11:04:00 GMT</pubDate><guid>http://www.blogjava.net/morgan/articles/method.html</guid><wfw:comment>http://www.blogjava.net/morgan/comments/387671.html</wfw:comment><comments>http://www.blogjava.net/morgan/articles/method.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/morgan/comments/commentRss/387671.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/morgan/services/trackbacks/387671.html</trackback:ping><description><![CDATA[&nbsp; &nbsp; &nbsp; &nbsp; 近期的努力学习，一直希望能突破一个瓶颈，就是熟练工，目前感觉到自己就是一个熟练工，对于工作中所接触到的技术，基本的API都知道，完成工作也比较顺利，按照以前在华为外包做开发的经历，有领导明言，开发就是倒腾一堆API么。我想，开发如果仅仅是倒腾一堆API的话，那么这种工作没有任何意义，因为这一堆API的倒腾最终会实现自动化，就算不能，我们开发人员也只是倒腾API的工具，没有任何价值而言，正因为如此，近期才会有突破这个瓶颈的强烈欲望，希望通过摆脱对工具的依赖，找出技术的本质，达到进一步的提高。<br />&nbsp; &nbsp; &nbsp; &nbsp; 今天无意间读到林锐博士写的一本书--&lt;&lt;软件工程思想&gt;&gt;，随便翻了一下，看到其中有一段关于软件开发的基本策略，现记录如下。<br />&nbsp; &nbsp; &nbsp; &nbsp; 软件开发的基本策略有三种，复用，分而治之，优化-折中。<br />&nbsp; &nbsp; &nbsp; &nbsp; 复用，就是我们可以利用前人开发的成熟功能或模块进行组装调用，来实现我们在开发工作中需要的功能，但是仅仅这么复用下去的话，那么我们也不会有进步，也不会有创新，个人价值从何体现？所以我们需要在复用的同时，对成熟模块进行优化，理解它的工作原理，从而达到更好的使用，以及站在更高的层面来实现成熟模块的功能，还有对现有系统也要进行优化。此外，复用还需要注意的是，复用是我们拿别人的东西，同样，我们做的东西，也要方便别人来拿着用才可以。这样才能实现最大价值。<br />&nbsp; &nbsp; &nbsp; &nbsp; 分而治之，好像很多地方都有提到这个名词，我在算法书上也有见过类似的思想。将一个复杂的功能分解成很多个简单的功能，然后逐一击破，最后将每个简单功能的实现组合起来，就是这个复杂功能的实现了。但是分解问题的过程需要注意的是，分解并不是简单的拆卸，要确保分解后的功能，最后归并，还是原来的复杂问题才可以。<br />&nbsp; &nbsp; &nbsp; &nbsp; 优化-折中，优化工作并不是可有可无的工作，而是我们必须要做的事情，当优化工作中遇到困难时，我们可以选择折中方案，但是该方案的前提是不能损失其他功能。<img src ="http://www.blogjava.net/morgan/aggbug/387671.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/morgan/" target="_blank">morgan</a> 2012-09-13 19:04 <a href="http://www.blogjava.net/morgan/articles/method.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java反射调用main方法，private方法实现</title><link>http://www.blogjava.net/morgan/articles/reflection.html</link><dc:creator>morgan</dc:creator><author>morgan</author><pubDate>Wed, 12 Sep 2012 12:55:00 GMT</pubDate><guid>http://www.blogjava.net/morgan/articles/reflection.html</guid><wfw:comment>http://www.blogjava.net/morgan/comments/387590.html</wfw:comment><comments>http://www.blogjava.net/morgan/articles/reflection.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/morgan/comments/commentRss/387590.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/morgan/services/trackbacks/387590.html</trackback:ping><description><![CDATA[&nbsp; &nbsp; &nbsp;最近研究jetty源代码的时候，发现这个容器里面的代码根本无法看懂，都是java语法，基本上都是反射+设计模式+配置文件。很莫名奇妙的方法调用。里面有调用main方法的反射，结果没看懂，所以就再来研究研究反射功能。由于反射的文章在网上太多了，我主要研究了一下main方法，private方法的调用。如下，反射调用HelloWorld类的方法。HelloWorld类如下：<br />&nbsp; &nbsp;<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"><span style="color: #0000ff; ">public</span>&nbsp;<span style="color: #0000ff; ">class</span>&nbsp;HelloWorld&nbsp;{&nbsp;<br />&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("HelloWorld");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;prt(String&nbsp;msg){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(msg);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div>&nbsp;&nbsp;<br />&nbsp; &nbsp; &nbsp;调用main方法如下：<br />&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<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"><span style="color: #0000ff; ">public</span>&nbsp;<span style="color: #0000ff; ">class</span>&nbsp;HelloWorldRefection&nbsp;{&nbsp;<br />&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;InstantiationException,&nbsp;IllegalAccessException,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SecurityException,&nbsp;NoSuchMethodException,&nbsp;IllegalArgumentException,&nbsp;InvocationTargetException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;method&nbsp;=&nbsp;HelloWorld.<span style="color: #0000FF; ">class</span>.getMethod("main",String[].<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method.invoke(<span style="color: #0000FF; ">null</span>,(Object)<span style="color: #0000FF; ">new</span>&nbsp;String[]{});<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div>&nbsp; &nbsp; &nbsp;调用private方法如下:<br />&nbsp; &nbsp;&nbsp;<div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; ">&nbsp;<span style="color: #0000ff; ">public</span>&nbsp;<span style="color: #0000ff; ">class</span>&nbsp;HelloWorldRefection&nbsp;{&nbsp;<br />&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;InstantiationException,&nbsp;IllegalAccessException,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SecurityException,&nbsp;NoSuchMethodException,&nbsp;IllegalArgumentException,&nbsp;InvocationTargetException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;clazz&nbsp;=&nbsp;HelloWorld.<span style="color: #0000FF; ">class</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HelloWorld&nbsp;helloworld&nbsp;=&nbsp;HelloWorld.<span style="color: #0000FF; ">class</span>.newInstance();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method[]&nbsp;methods&nbsp;=&nbsp;clazz.getDeclaredMethods();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(Method&nbsp;method&nbsp;:&nbsp;methods)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(method.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(method.getName().equals("prt")){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method.setAccessible(<span style="color: #0000FF; ">true</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method.invoke(helloworld,&nbsp;"hello");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div>&nbsp; &nbsp; &nbsp;总结:<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1 调用main方法需要注意，main方法的参数为String[]，但是在method.invoke时，需要将String[]强制转换为Object，至于原因，网上很多说这个，主 &nbsp; &nbsp; &nbsp; 要是说jdk执行main方法时要将String[]分成多个参数等等。后续我分析了源代码后，会将这个问题专门写个文章出来。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2 调用private方法需要注意，在调用此方法之前，需要将此执行的方法设置以下，而不是随便找个地方运行下method.setAccessible(true)就完事了。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3 使用反射动态调用方法时，主要是用method.invoke()方法，如果是静态方法，则invoke的第一个参数设置null，如果不是静态方法，则将第一个参数设 &nbsp; &nbsp; &nbsp;置为该类生成的对象即可。<img src ="http://www.blogjava.net/morgan/aggbug/387590.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/morgan/" target="_blank">morgan</a> 2012-09-12 20:55 <a href="http://www.blogjava.net/morgan/articles/reflection.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windchill 中实现获取带有层级记录的BOM功能</title><link>http://www.blogjava.net/morgan/articles/BOM.html</link><dc:creator>morgan</dc:creator><author>morgan</author><pubDate>Wed, 12 Sep 2012 08:14:00 GMT</pubDate><guid>http://www.blogjava.net/morgan/articles/BOM.html</guid><wfw:comment>http://www.blogjava.net/morgan/comments/387558.html</wfw:comment><comments>http://www.blogjava.net/morgan/articles/BOM.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/morgan/comments/commentRss/387558.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/morgan/services/trackbacks/387558.html</trackback:ping><description><![CDATA[&nbsp; &nbsp; &nbsp; 在windchill中，BOM管理作为一种核心的业务功能存在，但是在windchill10.0版本的系统OOTB功能中，BOM无法提取零件的分类属性，因此一般情况下，都会进行克制化开发，获取BOM结构以及零件的层级是导出BOM报表的关键代码。获取BOM一般通过递归进行处理，往往都是传入顶层的部件，通过深度优先遍历，即可获取BOM结构，但是零件的层级，在系统的数据库中并没有进行记录，因此需要我们通过代码来计算。其实，零件的层级计算可以转换成递归算法的深度，因此实现BOM报表功能的核心代码就是要实现递归，以及计算递归深度。<br /><br />&nbsp; &nbsp; &nbsp; 1 先定义一个类，记录部件，部件的使用关系，部件层级。定义如下：<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>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;BOMElement&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">index&nbsp;部件在BOM中的层数</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;index;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">part&nbsp;BOM中的部件</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;WTPart&nbsp;part;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">link&nbsp;部件的link(link&nbsp;描述当前部件)</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;WTPartUsageLink&nbsp;link;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">根节点元素的初始化</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;BOMElement(WTPart&nbsp;part){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.index&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.part&nbsp;=&nbsp;part;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.link&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">所有子节点元素的初始化</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;BOMElement(<span style="color: #0000FF; ">int</span>&nbsp;index,WTPart&nbsp;part,WTPartUsageLink&nbsp;link){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.index&nbsp;=&nbsp;index;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.part&nbsp;=&nbsp;part;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.link&nbsp;=&nbsp;link;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;getIndex()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;index;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setIndex(<span style="color: #0000FF; ">int</span>&nbsp;index)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.index&nbsp;=&nbsp;index;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;WTPart&nbsp;getPart()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;part;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setPart(WTPart&nbsp;part)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.part&nbsp;=&nbsp;part;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;WTPartUsageLink&nbsp;getLink()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;link;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setLink(WTPartUsageLink&nbsp;link)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.link&nbsp;=&nbsp;link;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><br />&nbsp; &nbsp; &nbsp; 2 传入顶层部件，实现递归查询子部件，并定义变量，记录递归深度：<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 />-->&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;List&lt;BOMElement&gt;&nbsp;queryBOM(WTPart&nbsp;part)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;WTException{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BOMElement&nbsp;root&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;BOMElement(part);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;BOMElement&gt;&nbsp;list&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ArrayList&lt;BOMElement&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConfigSpec&nbsp;configSpec&nbsp;=&nbsp;WTPartHelper.service.findWTPartConfigSpec();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;index&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;=&nbsp;querySubBOMList(root,configSpec,list,index);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;list;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;List&lt;BOMElement&gt;&nbsp;querySubBOMList(BOMElement&nbsp;element,ConfigSpec&nbsp;configSpec,List&lt;BOMElement&gt;&nbsp;list,<span style="color: #0000FF; ">int</span>&nbsp;index)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;WTException{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(element);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueryResult&nbsp;qr&nbsp;=&nbsp;WTPartHelper.service.getUsesWTParts(element.getPart(),configSpec);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Vector&lt;Object&gt;&nbsp;vector&nbsp;=&nbsp;qr.getObjectVectorIfc().getVector();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;vector.size();i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Persistable[]&nbsp;persist&nbsp;=&nbsp;(Persistable[])&nbsp;vector.get(i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BOMElement&nbsp;subElement&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;BOMElement(index,(WTPart)persist[1],(WTPartUsageLink)persist[0]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;querySubBOMList(subElement,configSpec,list,index);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index--;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;list;<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div>&nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp;3 上面定义中，index变量记录递归深度，在递归调用之前，该变量自增1，表示递归调用一次，递归调用后，该变量自减1，表示递归调用减少一次。以此来记录递归调用的次数。并在构造BOMElement中，以此来记录零件的层级。&nbsp;<br /><br />&nbsp;<img src ="http://www.blogjava.net/morgan/aggbug/387558.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/morgan/" target="_blank">morgan</a> 2012-09-12 16:14 <a href="http://www.blogjava.net/morgan/articles/BOM.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>博客开篇</title><link>http://www.blogjava.net/morgan/articles/387543.html</link><dc:creator>morgan</dc:creator><author>morgan</author><pubDate>Wed, 12 Sep 2012 06:13:00 GMT</pubDate><guid>http://www.blogjava.net/morgan/articles/387543.html</guid><wfw:comment>http://www.blogjava.net/morgan/comments/387543.html</wfw:comment><comments>http://www.blogjava.net/morgan/articles/387543.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/morgan/comments/commentRss/387543.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/morgan/services/trackbacks/387543.html</trackback:ping><description><![CDATA[&nbsp; &nbsp; &nbsp;近期回顾了两篇文章，&lt;&lt;<a href="http://blog.csdn.net/g9yuayon/article/details/1437195">银弹和我们的职业</a>&gt;&gt;和&lt;&lt;<a href="http://blog.csdn.net/Dreamcode/article/details/5925013">无剑胜有剑,软件大师之路的探索</a>&gt;&gt;。<br />&nbsp; &nbsp; &nbsp;通过银弹的介绍，了解到编程的本质困难不在哪种语言可以实现什么样的功能，也不是哪种的语言的什么语法等等，而是在于抽象结构的规范，设计结构等。文中的例子很贴切，如果拿摄影来比编程的话，摄影的本质困难在于艺术感觉，而不是使用何种相机。<br />&nbsp; &nbsp; &nbsp;对于第二篇的描述，主要讲述了编程和武侠中的剑术是相通的，最起码理念一致。我们往往使用了很好很强大的工具，但是因为没有深入了解工具，最后沦落成了工具的工具，不得不说，这是一个技术人员的悲哀。所以这篇文章强调了基础知识，基础理论的掌握，做到厚积薄发，才能更有效的使用工具，对于我们编程，有一个更高层次的把控。<br /><br />&nbsp; &nbsp; &nbsp; 所以通过这两篇文章的回顾，算是温故知新，对几年工作的总结，发现如果再不悬崖勒马，最后的结果就是自己变成工具的工具了。这也是这个博客出现的缘由了。这个博客更新应该比较慢，但是每一篇都是经过深思熟虑才会分享出来。<br /><br />&nbsp; &nbsp; &nbsp; 工作比较忙，先写到这里。算是一个开篇的记录。希望能坚持下来，写一个比较好的博客，分享自己的成长，不要做虎头蛇尾的事情。<img src ="http://www.blogjava.net/morgan/aggbug/387543.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/morgan/" target="_blank">morgan</a> 2012-09-12 14:13 <a href="http://www.blogjava.net/morgan/articles/387543.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>