﻿<?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-耐心无止境 成功一瞬间-随笔分类-tuscany</title><link>http://www.blogjava.net/jhyan/category/36857.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 20 Dec 2008 10:41:07 GMT</lastBuildDate><pubDate>Sat, 20 Dec 2008 10:41:07 GMT</pubDate><ttl>60</ttl><item><title>tuscany学习笔记一（java组件实现中服务定义与解析）</title><link>http://www.blogjava.net/jhyan/archive/2008/12/20/247521.html</link><dc:creator>Joshua Yan</dc:creator><author>Joshua Yan</author><pubDate>Sat, 20 Dec 2008 10:01:00 GMT</pubDate><guid>http://www.blogjava.net/jhyan/archive/2008/12/20/247521.html</guid><wfw:comment>http://www.blogjava.net/jhyan/comments/247521.html</wfw:comment><comments>http://www.blogjava.net/jhyan/archive/2008/12/20/247521.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jhyan/comments/commentRss/247521.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jhyan/services/trackbacks/247521.html</trackback:ping><description><![CDATA[在学习tuscany到过程遇到一个疑问（java组件实现是如何解析java类文件中的服务的？如果没有配置服务，默认服务应该是什么？），开始的时候一直无法想清楚，通过阅读源码终于了解了部分解析过程<br />
<br />
以tuscany中的Calculator为例说明服务的定义：<br />
<br />
1.&nbsp; 如果按照例子本身的代码和配置，我们应该如何获取服务呢？<br />
<br />
<br />
<span style="color: #000000;">CalculatorService实现代码</span><br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;calculator;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.osoa.sca.annotations.Reference;<br />
<br />
<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;*&nbsp;An&nbsp;implementation&nbsp;of&nbsp;the&nbsp;Calculator&nbsp;service.<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><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;CalculatorServiceImpl&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;CalculatorService&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;AddService&nbsp;addService;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;SubtractService&nbsp;subtractService;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;MultiplyService&nbsp;multiplyService;<br />
。。。。。。。。。。。。。<br />
</span></div>
<br />
配置：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">component&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="CalculatorServiceComponent"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">implementation</span><span style="color: #ff0000;">.java&nbsp;class</span><span style="color: #0000ff;">="calculator.CalculatorServiceImpl"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">reference&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="addService"</span><span style="color: #ff0000;">&nbsp;target</span><span style="color: #0000ff;">="AddServiceComponent"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">reference&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="subtractService"</span><span style="color: #ff0000;">&nbsp;target</span><span style="color: #0000ff;">="SubtractServiceComponent"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">reference&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="multiplyService"</span><span style="color: #ff0000;">&nbsp;target</span><span style="color: #0000ff;">="MultiplyServiceComponent"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">reference&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="divideService"</span><span style="color: #ff0000;">&nbsp;target</span><span style="color: #0000ff;">="DivideServiceComponent"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">component</span><span style="color: #0000ff;">&gt;</span></div>
<br />
&nbsp; a. 例子中获取服务的方法：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">CalculatorService&nbsp;calculatorService&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scaDomain.getService(CalculatorService.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">CalculatorServiceComponent</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span></div>
<br />
通过上述代码我们就可以获取相应的服务了，我们不仅要问，为什么能够获取相应的服务呢？<br />
<span style="color: red;"><br />
根据java组件实现规范说明，如果组件只包含一个服务，那么我们在获取服务的时候可以省略服务的名字。</span><br />
<br />
<span style="font-size: 18pt;"><span style="color: red;">我的问题是：省略的服务名字是什么？</span></span><br />
<br />
<br />
b. 完整获取服务的方法：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">CalculatorService&nbsp;calculatorService1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">scaDomain.getService(CalculatorService.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">CalculatorServiceComponent/CalculatorServiceImpl</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span></div>
<br />
大家通过比较就可以知道，其实省略的<span style="color: red;"><span style="color: #060000;">服务名字是</span> CalculatorServiceImpl</span><br />
<br />
为什么是这个名字，大家可以参考源码中的 <br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(services.isEmpty())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;class&nbsp;is&nbsp;the&nbsp;interface</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addService(type,&nbsp;clazz);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
<br />
2. 自己定义一个服务<br />
<br />
自己在实现中添加服务声明<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">1</span>&nbsp;<span style="color: #000000;">@Service(CalculatorService.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">)<br />
</span><span style="color: #008080;">2</span>&nbsp;<span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;CalculatorServiceImpl&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;CalculatorService&nbsp;{<br />
</span><span style="color: #008080;">3</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;AddService&nbsp;addService;<br />
</span><span style="color: #008080;">5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;SubtractService&nbsp;subtractService;<br />
</span><span style="color: #008080;">6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;MultiplyService&nbsp;multiplyService;<br />
</span><span style="color: #008080;">7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;DivideService&nbsp;divideService;<br />
。。。。。。<br />
</span></div>
<br />
<br />
我们可以通过如下方式获取服务：<br />
<br />
a. 例子中的方式<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">CalculatorService&nbsp;calculatorService&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scaDomain.getService(CalculatorService.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">CalculatorServiceComponent</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span></div>
<br />
b. 完整方式<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">CalculatorService&nbsp;calculatorService1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">scaDomain.getService(CalculatorService.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">CalculatorServiceComponent/CalculatorService</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span></div>
<br />
<span style="color: #ff0000;">我们通过如下方式就<span style="font-size: 24pt;">＊不能＊</span>获取服务了</span><br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">CalculatorService&nbsp;calculatorService1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">scaDomain.getService(CalculatorService.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">CalculatorServiceComponent/CalculatorServiceImpl</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span></div>
<br />
<br />
原因很简单，实现不会再添加默认服务（<span style="color: #000000;">CalculatorServiceImpl</span>）了<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
源码摘录如下：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;">org.apache.tuscany.sca.implementation.java.introspect.impl.HeuristicPojoProcessor<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;visitEnd(Class</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;clazz,&nbsp;JavaImplementation&nbsp;type)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;IntrospectionException&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">org.apache.tuscany.sca.assembly.Service</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;services&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;type.getServices();<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(services.isEmpty())&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;heuristically&nbsp;determine&nbsp;the&nbsp;service</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;following&nbsp;is&nbsp;quoted&nbsp;from&nbsp;Java&nbsp;Specification&nbsp;1.2.1.3.&nbsp;Introspecting&nbsp;services&nbsp;offered&nbsp;by&nbsp;a&nbsp;Java&nbsp;implementation<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;In&nbsp;the&nbsp;cases&nbsp;described&nbsp;below,&nbsp;the&nbsp;services&nbsp;offered&nbsp;by&nbsp;a&nbsp;Java&nbsp;implementation&nbsp;class&nbsp;may&nbsp;be&nbsp;determined<br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;through&nbsp;introspection,&nbsp;eliding&nbsp;the&nbsp;need&nbsp;to&nbsp;specify&nbsp;them&nbsp;using&nbsp;@Service.&nbsp;The&nbsp;following&nbsp;algorithm&nbsp;is&nbsp;used&nbsp;<br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;to&nbsp;determine&nbsp;how&nbsp;services&nbsp;are&nbsp;introspected&nbsp;from&nbsp;an&nbsp;implementation&nbsp;class:<br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;If&nbsp;the&nbsp;interfaces&nbsp;of&nbsp;the&nbsp;SCA&nbsp;services&nbsp;are&nbsp;not&nbsp;specified&nbsp;with&nbsp;the&nbsp;@Service&nbsp;annotation&nbsp;on&nbsp;the&nbsp;<br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;implementation&nbsp;class,&nbsp;it&nbsp;is&nbsp;assumed&nbsp;that&nbsp;all&nbsp;implemented&nbsp;interfaces&nbsp;that&nbsp;have&nbsp;been&nbsp;annotated&nbsp;<br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;as&nbsp;@Remotable&nbsp;are&nbsp;the&nbsp;service&nbsp;interfaces&nbsp;provided&nbsp;by&nbsp;the&nbsp;component.&nbsp;If&nbsp;none&nbsp;of&nbsp;the&nbsp;implemented&nbsp;<br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;interfaces&nbsp;is&nbsp;remotable,&nbsp;then&nbsp;by&nbsp;default&nbsp;the&nbsp;implementation&nbsp;offers&nbsp;a&nbsp;single&nbsp;service&nbsp;whose&nbsp;type&nbsp;<br />
</span><span style="color: #008080;">18</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;is&nbsp;the&nbsp;implementation&nbsp;class.<br />
</span><span style="color: #008080;">19</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Class</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;interfaces&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getAllInterfaces(clazz);<br />
</span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(Class</span><span style="color: #000000;">&lt;?&gt;</span><span style="color: #000000;">&nbsp;i&nbsp;:&nbsp;interfaces)&nbsp;{<br />
</span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(i.isAnnotationPresent(Remotable.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;i.isAnnotationPresent(WebService.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">))&nbsp;{<br />
</span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addService(type,&nbsp;i);<br />
</span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(services.isEmpty())&nbsp;{<br />
</span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;class&nbsp;is&nbsp;the&nbsp;interface</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addService(type,&nbsp;clazz);<br />
</span><span style="color: #008080;">29</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Method</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;methods&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getAllUniquePublicProtectedMethods(clazz,&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">32</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">type.getReferenceMembers().isEmpty()&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!</span><span style="color: #000000;">type.getPropertyMembers().isEmpty())&nbsp;{<br />
</span><span style="color: #008080;">33</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;references&nbsp;and&nbsp;properties&nbsp;have&nbsp;been&nbsp;explicitly&nbsp;defined<br />
</span><span style="color: #008080;">34</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(type.getServices().isEmpty())&nbsp;{<br />
</span><span style="color: #008080;">35</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;calculateServiceInterface(clazz,&nbsp;type,&nbsp;methods);<br />
</span><span style="color: #008080;">36</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(type.getServices().isEmpty())&nbsp;{<br />
</span><span style="color: #008080;">37</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;ServiceTypeNotFoundException(clazz.getName());<br />
</span><span style="color: #008080;">38</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">39</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">40</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;evaluateConstructor(type,&nbsp;clazz);<br />
</span><span style="color: #008080;">41</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">42</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">43</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;calcPropRefs(methods,&nbsp;services,&nbsp;type,&nbsp;clazz);<br />
</span><span style="color: #008080;">44</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;evaluateConstructor(type,&nbsp;clazz);<br />
</span><span style="color: #008080;">45</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">46</span>&nbsp;</div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/jhyan/aggbug/247521.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jhyan/" target="_blank">Joshua Yan</a> 2008-12-20 18:01 <a href="http://www.blogjava.net/jhyan/archive/2008/12/20/247521.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>