﻿<?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-JAVA学习之路</title><link>http://www.blogjava.net/sham2k/</link><description>这里记录了我从C++转型到JAVA的过程中的学习总结与体会。</description><language>zh-cn</language><lastBuildDate>Sat, 18 Apr 2026 14:46:31 GMT</lastBuildDate><pubDate>Sat, 18 Apr 2026 14:46:31 GMT</pubDate><ttl>60</ttl><item><title>淘宝开店之流量</title><link>http://www.blogjava.net/sham2k/archive/2013/09/25/404442.html</link><dc:creator>飞鹰</dc:creator><author>飞鹰</author><pubDate>Wed, 25 Sep 2013 15:28:00 GMT</pubDate><guid>http://www.blogjava.net/sham2k/archive/2013/09/25/404442.html</guid><wfw:comment>http://www.blogjava.net/sham2k/comments/404442.html</wfw:comment><comments>http://www.blogjava.net/sham2k/archive/2013/09/25/404442.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sham2k/comments/commentRss/404442.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sham2k/services/trackbacks/404442.html</trackback:ping><description><![CDATA[
 
在淘宝申请了一个商店，还将销售的各类产品添加到店里。但由于是新店，几乎没有人光顾，门可罗雀。如果各位朋友觉得我写的一些文档有些作用，就请关顾下妹妹的网店。随便逛逛，不必购买任何东西。当然，如果你对某产品感兴趣，自然可以和我联系。呵呵。<br />敬请光临妹妹的淘宝店：<a href="http://prefer88.taobao.com">prefer88.taobao.com</a> 
<img src ="http://www.blogjava.net/sham2k/aggbug/404442.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sham2k/" target="_blank">飞鹰</a> 2013-09-25 23:28 <a href="http://www.blogjava.net/sham2k/archive/2013/09/25/404442.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于报文驱动的EJB项目开发过程（简述）</title><link>http://www.blogjava.net/sham2k/archive/2011/10/29/362290.html</link><dc:creator>飞鹰</dc:creator><author>飞鹰</author><pubDate>Sat, 29 Oct 2011 12:22:00 GMT</pubDate><guid>http://www.blogjava.net/sham2k/archive/2011/10/29/362290.html</guid><wfw:comment>http://www.blogjava.net/sham2k/comments/362290.html</wfw:comment><comments>http://www.blogjava.net/sham2k/archive/2011/10/29/362290.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sham2k/comments/commentRss/362290.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sham2k/services/trackbacks/362290.html</trackback:ping><description><![CDATA[
 
所谓报文驱动，就是模块间的相互调用通过定义了格式的报文传递输入参数，返回值通过应答报文传递的模块调用方式。模块指实现独立业务功能的服务类，而非方法间的调用。例如：转账模块调用记账模块。模块间的报文传递，可以是WebService、RMI等同步方式，也可以是MQ等异步方式。本文不是完整的实现过程，而是纲要，防止自己忘记的备忘录。<br />本文的软件系统架构参考《<a id="homepage1_HomePageDays_DaysList_ctl00_DayItem_DayList_ctl00_TitleUrl" class="postTitle2" href="http://www.blogjava.net/sham2k/archive/2009/10/10/297629.html">基于EJB 3.0的企业应用后端框架</a>》。<br /><br />1、创建数据库及数据库表。<br /><br />2、创建实体类及相应的DAO类库，本库是EJB模块，可以动态更换。实体类总是对应数据库表，每个表对应一个或多个实体类。实体类是POJO对象。DAO类使用JPA完成实体对象的增、删、改、查、锁等操作，和具体业务逻辑无关。<br />（1）创建EJB项目，包含ejbModule、testcase、script等目录。源码放置到ejbModule目录，测试代码放置到testcase，数据库相关脚本放置到Script目录。<br />（2）给项目添加JPA支持。从ApplicationServer支持的JPA中选择一款JPA实现。实际部署时，JPA模块是可以动态更换的。<br />（3）编辑项目的持久化配置文件，和数据库配置保持一致。<br />（4）给测试或JPA添加依赖的外部JAR包。<br />--------- 准备就绪<br />（5）从数据库生成实体类并定制，确保每个实体类有唯一的序列化ID。每个实体类有主键，实体类和主键类均是可序列化的。如果实体对象和数据库数据间要进行某种转换动作，由实体类的Get/Set方法完成。<br />（6）编写一个AbstractEnityDao类实现调用JPA完成实体对象的持久化操作。为每个实体类派生一个DAO类完成该实体的持久化。该DAO是一个SessionBean，且只实现本地方法。如果要对实体的值合法性进行检查，则在DAO类完成。<br />（7）编写DAO和实体类的测试代码，确认每个DAO类均工作正常。<br /><br />3、创建实体类及DAO类的client库。本库是普通的JAR包，给未来使用实体对象和DAO对象的对象使用。<br />（1）DAO类库完成并定版后，创建JAR库。<br />（2）复制DAO类库的全部实体类到本库，确保包名没有变化。<br />（3）复制DAO类库的全部DAO接口到本库，确保包名没有变化。<br />（4）编辑全部实体类，去掉@JPA的注释并纠正import语句，以减少本库的依赖性。<br /><br />4、创建报文库，本库是普通Jar包。<br />（1）为每个报文创建一个报文类。报文类是POJO对象，且必须可序列化。<br />（2）如果使用报文的全部时JAVA代码，则使用默认的Java序列化对象的方法传递报文对象。否则，实现序列化方法，将报文串转换为报文对象和将报文对象转换为报文串。Java内部使用报文对象，模块间调用使用报文串。<br />（3）如果使用XML作为报文串，则可以为每个报文创建一个类和一个映射文件，通过XML通用类库实现对象和串的转换。<br /><br />5、编写业务服务库，本库是EJB模块。<br />（1）创建AbstractBusinessService类，定义业务服务的接口，并实现通用的方法。<br />（2）为每个报文创建一个业务服务类继承AbstractBusinessService类，并实现对报文的特殊处理。业务服务类是SessionBean，实现本地接口。<br />（3）为每个业务服务类编写测试代码，确保每个服务类均可以正常工作。<br /><br />6、编写业务引擎服务（EJB服务）<br />（1）本服务提供本地和远程方法供Client使用，接收Client传递的业务报文对象，根据配置创建并调用业务服务对报文进行处理。<br />（2）业务引擎通常提供实时调用和MQ调用两类引擎，后者是消息驱动Bean。<br /><br />7、Web服务<br />（1）将业务引擎服务封装为WebService或http/REST风格的服务，供外部系统调用。<br />------------- 完成全部项目<br /><br />8、部署：将全部类库打包为EAR发布，将报文库发布给Java外部客户。<br /><br /><br />&nbsp;
<img src ="http://www.blogjava.net/sham2k/aggbug/362290.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sham2k/" target="_blank">飞鹰</a> 2011-10-29 20:22 <a href="http://www.blogjava.net/sham2k/archive/2011/10/29/362290.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于EJB 3.0的企业应用后端框架</title><link>http://www.blogjava.net/sham2k/archive/2009/10/10/297629.html</link><dc:creator>飞鹰</dc:creator><author>飞鹰</author><pubDate>Sat, 10 Oct 2009 01:24:00 GMT</pubDate><guid>http://www.blogjava.net/sham2k/archive/2009/10/10/297629.html</guid><wfw:comment>http://www.blogjava.net/sham2k/comments/297629.html</wfw:comment><comments>http://www.blogjava.net/sham2k/archive/2009/10/10/297629.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sham2k/comments/commentRss/297629.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sham2k/services/trackbacks/297629.html</trackback:ping><description><![CDATA[最近应公司要求，设计了一个基于EJB3.0的企业应用后端框架。<br />
本框架的设计要点是：<br />
1.框架按模块分为：接入服务、业务引擎、业务服务、业务组件、实体DAO五个组成部分。接入服务负责提供对外接口，供系统参与者（含人机界面）提交服务请求，支持webService、消息中间件等多种通信模式；业务引擎负责根据业务请求，加载相应的业务服务处理请求并返回回应；业务服务负责加载与调度业务组件进行业务处理，并返回回应报文给业务引擎；实体DAO负责完成数据库操作；<br />
2.全部模块组装为一个EAR，除接入服务外，其他模块均是EJB3.0的SessionBean，EJB访问均使用本地接口以保障系统的性能；WebService接入服务是Web应用；消息中间件接入服务是MDB；<br />
3、事务控制由EJB容器管理，支持数据库和消息中间件的XA事务；<br />
4、多个应用间相互访问，可以通过消息中间件接入服务的异步访问，也可以通过webService接入服务的无事务一致性同步访问，还可以直接通过业务引擎进行事务一致的同步访问；<br />
5、业务引擎是业务服务的总代理，所有业务服务均有业务引擎调度执行。<br />
<br />
系统的总体结构如下图所示：<br />
<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/sham2k/AA.JPG" />
<img src ="http://www.blogjava.net/sham2k/aggbug/297629.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sham2k/" target="_blank">飞鹰</a> 2009-10-10 09:24 <a href="http://www.blogjava.net/sham2k/archive/2009/10/10/297629.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MS CAPICOM Samples</title><link>http://www.blogjava.net/sham2k/archive/2009/08/19/291745.html</link><dc:creator>飞鹰</dc:creator><author>飞鹰</author><pubDate>Wed, 19 Aug 2009 02:10:00 GMT</pubDate><guid>http://www.blogjava.net/sham2k/archive/2009/08/19/291745.html</guid><wfw:comment>http://www.blogjava.net/sham2k/comments/291745.html</wfw:comment><comments>http://www.blogjava.net/sham2k/archive/2009/08/19/291745.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/sham2k/comments/commentRss/291745.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sham2k/services/trackbacks/291745.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本文是 MS CryptoAPI Samples 的姐妹篇，演示如何使用微软的CAPICOM组件。CAPICOM组件是建立在CryptoAPI基础上的ActiveX控件，供JavaScript、VBScript以及其他非C/C++语言使用。使用该组件，极大简化加密、签名应用程序的编写，但功能略受限制。//&nbsp;examCAPI.cpp&nbsp;:&nbsp;定义控制台应用程序的入口...&nbsp;&nbsp;<a href='http://www.blogjava.net/sham2k/archive/2009/08/19/291745.html'>阅读全文</a><img src ="http://www.blogjava.net/sham2k/aggbug/291745.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sham2k/" target="_blank">飞鹰</a> 2009-08-19 10:10 <a href="http://www.blogjava.net/sham2k/archive/2009/08/19/291745.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MS CryptoAPI Samples</title><link>http://www.blogjava.net/sham2k/archive/2009/08/07/290170.html</link><dc:creator>飞鹰</dc:creator><author>飞鹰</author><pubDate>Thu, 06 Aug 2009 16:23:00 GMT</pubDate><guid>http://www.blogjava.net/sham2k/archive/2009/08/07/290170.html</guid><wfw:comment>http://www.blogjava.net/sham2k/comments/290170.html</wfw:comment><comments>http://www.blogjava.net/sham2k/archive/2009/08/07/290170.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/sham2k/comments/commentRss/290170.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sham2k/services/trackbacks/290170.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: //&nbsp;examCrypt.cpp&nbsp;:&nbsp;定义控制台应用程序的入口点。//#include&nbsp;"stdafx.h"//&nbsp;Link&nbsp;with&nbsp;the&nbsp;Crypt32.lib&nbsp;file.#pragma&nbsp;comment(lib,&nbsp;"Crypt32")#pragma&nbsp...&nbsp;&nbsp;<a href='http://www.blogjava.net/sham2k/archive/2009/08/07/290170.html'>阅读全文</a><img src ="http://www.blogjava.net/sham2k/aggbug/290170.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sham2k/" target="_blank">飞鹰</a> 2009-08-07 00:23 <a href="http://www.blogjava.net/sham2k/archive/2009/08/07/290170.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Weblogic 10.3 安装与配置</title><link>http://www.blogjava.net/sham2k/articles/288822.html</link><dc:creator>飞鹰</dc:creator><author>飞鹰</author><pubDate>Tue, 28 Jul 2009 15:55:00 GMT</pubDate><guid>http://www.blogjava.net/sham2k/articles/288822.html</guid><wfw:comment>http://www.blogjava.net/sham2k/comments/288822.html</wfw:comment><comments>http://www.blogjava.net/sham2k/articles/288822.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/sham2k/comments/commentRss/288822.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sham2k/services/trackbacks/288822.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: WebLogic 10.3 安装、配置与管理手册第一章 WebLogic 10.3 for Win32&#167;1.1 安装准备 下载WebLogic10.3 for x86 Win32安装文件； 安装Windows XP Sp2或Windows 2003 Server； 检查操作系统的磁盘空间，确保空闲空间在2G以上。&#167;1.2 安装过程&...&nbsp;&nbsp;<a href='http://www.blogjava.net/sham2k/articles/288822.html'>阅读全文</a><img src ="http://www.blogjava.net/sham2k/aggbug/288822.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sham2k/" target="_blank">飞鹰</a> 2009-07-28 23:55 <a href="http://www.blogjava.net/sham2k/articles/288822.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SUSE Linux 11.0 安装</title><link>http://www.blogjava.net/sham2k/articles/288821.html</link><dc:creator>飞鹰</dc:creator><author>飞鹰</author><pubDate>Tue, 28 Jul 2009 15:46:00 GMT</pubDate><guid>http://www.blogjava.net/sham2k/articles/288821.html</guid><wfw:comment>http://www.blogjava.net/sham2k/comments/288821.html</wfw:comment><comments>http://www.blogjava.net/sham2k/articles/288821.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sham2k/comments/commentRss/288821.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sham2k/services/trackbacks/288821.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;Suse Linux Enterprise Server 11.0安装、配置与管理手册Version 1.01. 安装准备l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x86计算机，20G以上硬盘，100M以太网卡，2G以上内存；l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 安装介质：SuseLin...&nbsp;&nbsp;<a href='http://www.blogjava.net/sham2k/articles/288821.html'>阅读全文</a><img src ="http://www.blogjava.net/sham2k/aggbug/288821.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sham2k/" target="_blank">飞鹰</a> 2009-07-28 23:46 <a href="http://www.blogjava.net/sham2k/articles/288821.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>W3C XML Schema 教程</title><link>http://www.blogjava.net/sham2k/articles/179825.html</link><dc:creator>飞鹰</dc:creator><author>飞鹰</author><pubDate>Wed, 13 Feb 2008 13:02:00 GMT</pubDate><guid>http://www.blogjava.net/sham2k/articles/179825.html</guid><wfw:comment>http://www.blogjava.net/sham2k/comments/179825.html</wfw:comment><comments>http://www.blogjava.net/sham2k/articles/179825.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sham2k/comments/commentRss/179825.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sham2k/services/trackbacks/179825.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: XML SCHEMA教程本教程是笔者学习W3C的《XML Schema Tutorial》的笔记。如果你对原教程感兴趣，可以浏览http://www.w3schools.com/schema/default.asp。XML Schema是W3C制定的基于XML格式的XML文档结构描述标准。作为一种文档描述语言，通常我们将其简写为XSD（XML Schema Define）。XSD作为DTD...&nbsp;&nbsp;<a href='http://www.blogjava.net/sham2k/articles/179825.html'>阅读全文</a><img src ="http://www.blogjava.net/sham2k/aggbug/179825.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sham2k/" target="_blank">飞鹰</a> 2008-02-13 21:02 <a href="http://www.blogjava.net/sham2k/articles/179825.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA 内部类的简单总结</title><link>http://www.blogjava.net/sham2k/archive/2008/02/12/179678.html</link><dc:creator>飞鹰</dc:creator><author>飞鹰</author><pubDate>Tue, 12 Feb 2008 05:12:00 GMT</pubDate><guid>http://www.blogjava.net/sham2k/archive/2008/02/12/179678.html</guid><wfw:comment>http://www.blogjava.net/sham2k/comments/179678.html</wfw:comment><comments>http://www.blogjava.net/sham2k/archive/2008/02/12/179678.html#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://www.blogjava.net/sham2k/comments/commentRss/179678.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sham2k/services/trackbacks/179678.html</trackback:ping><description><![CDATA[定义在一个类内部的类叫内部类，包含内部类的类称为外部类。内部类可以声明public、protected、private等访问限制，可以声明为abstract的供其他内部类或外部类继承与扩展，或者声明为static、final的，也可以实现特定的接口。static的内部类行为上象一个独立的类，非static在行为上类似类的属性或方法且禁止声明static的方法。内部类可以访问外部类的所有方法与属性，但static的内部类只能访问外部类的静态属性与方法。<br />
<br />
外部类按常规的类访问方式使用内部类，唯一的差别是外部类可以访问内部类的所有方法与属性，包括私有方法与属性。如：<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pinner p = new pinner();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;p.index = 20;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;p.Print();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ---- 这种方式适合外部类的非static方法；<br />
<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pouter po = new pouter();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pinner pi = po.new pinner();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pi.index = 40;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pi.Print();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ---- 这种方式适合外部类的static方法；<br />
<br />
内部类类似外部类的属性，因此访问内部类对象时总是需要一个创建好的外部类对象。内部类对象通过&#8216;外部类名.this.xxx&#8217;的形式访问外部类的属性与方法。如：<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println("Print in inner Outer.index=" + pouter.this.index);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println("Print in inner Inner.index=" + this.index);<br />
<br />
如果需要在其他类中访问内部类，可以使用：<br />
(1)外部类提供创建内部类的方法供其他类使用。如：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 外部类<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pinner getInner()<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return new pinner();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 其他类<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pouter.pinner pi = po.getInner();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pi.Print();<br />
<br />
(2)直接创建内部类的对象。如：<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pouter po = new pouter();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pouter.pinner pi = po.new pinner();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pi.Print();<br />
<br />
内部类可以声明在外部类的方法中或语句块中。如果内部类需要访问包含它的外部类方法或语句块的局部变量或参数，则该局部变量或参数必须是final的。外部类的其他方法、其他类无法访问声明在方法内部或块内部的内部类。<br />
<br />
如果一个类继承内部类，则创建该类的对象时需提供一个外部类的对象作为构造方法的参数。如：<br />
class Car<br />
{<br />
&nbsp;&nbsp; &nbsp;class Wheel<br />
&nbsp;&nbsp; &nbsp;{<br />
<br />
&nbsp;&nbsp; &nbsp;}<br />
}<br />
<br />
class SuperWheel extends Car.Wheel<br />
{<br />
&nbsp;&nbsp; &nbsp;SuperWheel(Car car)<br />
&nbsp;&nbsp; &nbsp;{<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;car.super();<br />
&nbsp;&nbsp; &nbsp;}<br />
<br />
&nbsp;&nbsp; &nbsp;public static void main(String [] args)<br />
&nbsp;&nbsp; &nbsp;{<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Car car = new Car();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;SuperWheel wl = new SuperWheel(car);<br />
&nbsp;&nbsp; &nbsp;} <br />
}<br />
<br />
如果创建命名的内部类没有多少实际意义时，可以创建匿名的内部类。比如使用内部类实现接口的功能(如事件处理器、适配器等)，而功能的差异较大，需要根据实际的情况创建相应的内部类时，可以使用匿名内部类。简单的示例如下：<br />
interface WebView<br />
{<br />
&nbsp;&nbsp; &nbsp;void doGet();<br />
}<br />
<br />
class A<br />
{<br />
&nbsp;&nbsp; &nbsp;WebView ShowName()<br />
&nbsp;&nbsp; &nbsp;{<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return new WebView()<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;void doGet()<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println("Name");<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;};<br />
&nbsp;&nbsp; &nbsp;}<br />
<br />
&nbsp;&nbsp; &nbsp;WebView ShowCode()<br />
&nbsp;&nbsp; &nbsp;{<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return new WebView()<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;void doGet()<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println("Code");<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;};<br />
&nbsp;&nbsp; &nbsp;}<br />
}<br />
<br />
最后，JAVA 内部类还有一个作用，那就是实现JAVA的多继承。JAVA本身是不允许多继承的，如果我们想一个类继承多个基类，就可以使用内部类。通过内部类分别继承一个基类，外部类创建内部类的对象，并使用内部类的方法，变相地实现了多继承。
<img src ="http://www.blogjava.net/sham2k/aggbug/179678.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sham2k/" target="_blank">飞鹰</a> 2008-02-12 13:12 <a href="http://www.blogjava.net/sham2k/archive/2008/02/12/179678.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA JNI 使用实例</title><link>http://www.blogjava.net/sham2k/archive/2008/02/11/179602.html</link><dc:creator>飞鹰</dc:creator><author>飞鹰</author><pubDate>Mon, 11 Feb 2008 05:29:00 GMT</pubDate><guid>http://www.blogjava.net/sham2k/archive/2008/02/11/179602.html</guid><wfw:comment>http://www.blogjava.net/sham2k/comments/179602.html</wfw:comment><comments>http://www.blogjava.net/sham2k/archive/2008/02/11/179602.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/sham2k/comments/commentRss/179602.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sham2k/services/trackbacks/179602.html</trackback:ping><description><![CDATA[JAVA可以通过JNI接口访问本地的动态连接库，从而扩展JAVA的功能。使用JAVA JNI接口主要包括以下步骤：<br />
(1)编写JAVA代码，注明要访问的本地动态连接库和本地方法；<br />
(2)编译JAVA代码得到.class文件；<br />
(3)使用javah -jni 生成该类对应的C语言.h文件；<br />
(4)使用C/C++实现（3）生成的.h文件中声明的各函数；<br />
(5)编译C/C++实现代码生成动态连接库。<br />
本文使用一个简单的helloWorld示例演示JNI的使用。<br />
<br />
（1）编写JAVA代码<br />
public class helloWorld<br />
{<br />
<strong>&nbsp;&nbsp;&nbsp; public native void SayHello(String name);</strong><br />
<br />
&nbsp;&nbsp;&nbsp; static<br />
&nbsp;&nbsp;&nbsp; {<br />
<strong>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.loadLibrary("examdll");</strong><br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public static void main(String [] argv)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; helloWorld hello = new helloWorld();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; hello.SayHello("myName");<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
（2）编译JAVA代码<br />
<br />
javac helloWorld.java<br />
<br />
（3）生成实现函数头文件<br />
<br />
javah -classpath . helloWorld<br />
<br />
得到的文件内容如下：<br />
<br />
/* DO NOT EDIT THIS FILE - it is machine generated */<br />
#include &lt;jni.h&gt;<br />
/* Header for class helloWorld */<br />
<br />
#ifndef _Included_helloWorld<br />
#define _Included_helloWorld<br />
#ifdef __cplusplus<br />
extern "C" {<br />
#endif<br />
/*<br />
&nbsp;* Class:&nbsp;&nbsp;&nbsp;&nbsp; helloWorld<br />
&nbsp;* Method:&nbsp;&nbsp;&nbsp; SayHello<br />
&nbsp;* Signature: (Ljava/lang/String;)V<br />
&nbsp;*/<br />
<strong>JNIEXPORT void JNICALL Java_helloWorld_SayHello<br />
&nbsp; (JNIEnv *, jobject, jstring);</strong><br />
<br />
#ifdef __cplusplus<br />
}<br />
#endif<br />
#endif<br />
<br />
（4）在VC中实现上述函数<br />
<br />
#include "helloWorld.h"<br />
#include &lt;stdio.h&gt;<br />
#include &lt;string.h&gt;<br />
void JNICALL Java_helloWorld_SayHello(JNIEnv * env, jobject obj, jstring str)<br />
{<br />
&nbsp;&nbsp;&nbsp; jboolean&nbsp; b&nbsp; = true;<br />
&nbsp;&nbsp;&nbsp; char s[80];<br />
&nbsp;&nbsp;&nbsp; memset(s, 0, sizeof(s));<br />
&nbsp;&nbsp;&nbsp; strcpy_s(s ,(char*)env-&gt;GetStringUTFChars(str, &amp;b));<br />
&nbsp;&nbsp;&nbsp; printf("Hello, %s", s);<br />
&nbsp;&nbsp;&nbsp; env-&gt;ReleaseStringUTFChars(str , NULL);<br />
}<br />
<br />
**** 这是JNI的关键：通过env我们可以使用JAVA提供的一组函数操作与转换函数传递的参数。<br />
<br />
（5）编译VC项目得到动态连接库 examdll.dll。<br />
<br />
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝<br />
附：如何操作与返回JAVA的参数与类型，这篇文章有些实际的例子可供参考：<br />
http://blog.sina.com.cn/s/blog_548cc485010005ct.html<br />
<br />
<br />
<img src ="http://www.blogjava.net/sham2k/aggbug/179602.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sham2k/" target="_blank">飞鹰</a> 2008-02-11 13:29 <a href="http://www.blogjava.net/sham2k/archive/2008/02/11/179602.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>