书签 分享 收藏 举报 版权申诉 / 36
上传文档赚钱

类型第4章-高级Java开发技术-《Eclipse从入门到精通》教学课件-课件.ppt

  • 上传人(卖家):晟晟文业
  • 文档编号:4853434
  • 上传时间:2023-01-18
  • 格式:PPT
  • 页数:36
  • 大小:1.56MB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《第4章-高级Java开发技术-《Eclipse从入门到精通》教学课件-课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    Eclipse从入门到精通 高级 Java 开发 技术 Eclipse 入门 精通 教学 课件
    资源描述:

    1、第第4 4章章 高级高级JavaJava开发技术开发技术在上一章,学习了在上一章,学习了Eclipse JDT的基本应用。这些基本的基本应用。这些基本的应用基本上是集中在编辑器的使用上。这一章,将学习更的应用基本上是集中在编辑器的使用上。这一章,将学习更多的高级功能。这些高级功能包括:项目的构建,项目的运多的高级功能。这些高级功能包括:项目的构建,项目的运行和测试,行和测试,JUnit的应用,代码的重构,以及的应用,代码的重构,以及Eclipse所提供所提供的其他辅助开发功能。的其他辅助开发功能。4.1 4.1 构建和运行构建和运行继续上章的继续上章的HelloPDE项目。编辑完上面项目。编辑

    2、完上面HelloPDE的的代码后,需要测试运行。在测试运行代码后,需要测试运行。在测试运行HelloPDE之前,需要之前,需要把把Java源代码进行编译和构建。编译源代码进行编译和构建。编译(Compile),就是使用,就是使用JDK提供的编译器,把提供的编译器,把Java代码编译成目标字节代码,这代码编译成目标字节代码,这只是第一步,这一步在是只是第一步,这一步在是JDT是自动完成的,每次修改保存是自动完成的,每次修改保存源代码,都会自动编译。第二步是构建源代码,都会自动编译。第二步是构建(Build),在编译的基,在编译的基础上,把目标代码和其他资源文件集成为可以执行的程序。础上,把目标代

    3、码和其他资源文件集成为可以执行的程序。下面进一步了解一下下面进一步了解一下JDT中的构建(中的构建(Build)功能。)功能。4.1.1 4.1.1 自动构建自动构建JDT提供了两种构建的方式,一种是自动构建,这是默提供了两种构建的方式,一种是自动构建,这是默认的方式。自动构建不需要用户干预,认的方式。自动构建不需要用户干预,JDT会自动判断何时会自动判断何时应该构建。构建过程包括了源代码的编译和资源文件的构建应该构建。构建过程包括了源代码的编译和资源文件的构建。而且。而且JDT采用的是增量式构建,每次只是构建需要的部分采用的是增量式构建,每次只是构建需要的部分,不用完全构建整个项目,又是在后

    4、台用线程的方式进行构,不用完全构建整个项目,又是在后台用线程的方式进行构建,所以对于一般项目来说,基本上觉察不到构建的过程。建,所以对于一般项目来说,基本上觉察不到构建的过程。大多数情况下,使用自动构建已经非常理想。大多数情况下,使用自动构建已经非常理想。4.1.2 4.1.2 手动构建手动构建并不是所有人都喜欢自动构建,有时候自动构建的线并不是所有人都喜欢自动构建,有时候自动构建的线程可能会影响一下前台的操作。另外程可能会影响一下前台的操作。另外JDT的增量式构建有时的增量式构建有时候也会出现一些小问题。还有一种情况也会导致有些人不喜候也会出现一些小问题。还有一种情况也会导致有些人不喜欢自动

    5、构建。欢自动构建。源代码很多的时候,源代码中可能有很多等待排除的源代码很多的时候,源代码中可能有很多等待排除的错误。自动构建后,这些错误会显示出来,在错误。自动构建后,这些错误会显示出来,在Package Explorer中出现大量的红色叉叉,非常中出现大量的红色叉叉,非常“难看难看”。有些用户。有些用户喜欢自己排除了错误后再自动构建。喜欢自己排除了错误后再自动构建。要取消自动构建也很简单,选择菜单要取消自动构建也很简单,选择菜单Project,把,把Build Automatically前面的勾去掉就可以了。前面的勾去掉就可以了。4.1.3 4.1.3 运行和调试运行和调试下面运行一下下面运

    6、行一下HelloPDE。点击工具栏上。点击工具栏上Run按钮的下按钮的下拉箭头,在下拉菜单中选择拉箭头,在下拉菜单中选择Run as-Java Application。4.1.4 4.1.4 设置调试断点设置调试断点设置断点很简单,在设置断点很简单,在Java编辑器左侧的信息栏上双击编辑器左侧的信息栏上双击,就可以设置断点。,就可以设置断点。4.1.5 4.1.5 调试透视图调试透视图设置断点后,按工具栏上的设置断点后,按工具栏上的Debug按钮。因为当前编按钮。因为当前编辑的代码已经运行过一次,只要运行过的代码仍然处于编辑辑的代码已经运行过一次,只要运行过的代码仍然处于编辑状态,按一下状态,

    7、按一下Debug按钮,默认就是根据上一次的运行或者按钮,默认就是根据上一次的运行或者调试设置执行当前的代码程序。调试设置执行当前的代码程序。4.2 4.2 使用使用JUnitJUnit在软件开发过程中,除了调试之外,还需要进行测试在软件开发过程中,除了调试之外,还需要进行测试。调试和测试是不同的概念,调试是对成品进行试运行,而。调试和测试是不同的概念,调试是对成品进行试运行,而测试则是在组装成成品之前,利用一些工具,参照某些标准测试则是在组装成成品之前,利用一些工具,参照某些标准,对零部件进行检测。在,对零部件进行检测。在Java开发中,使用率最高的测试开发中,使用率最高的测试工具是工具是JU

    8、nit。4.2.1 JUnit4.2.1 JUnit简介简介JUnit是由是由 Erich Gamma 和和 Kent Beck 编写的一个回编写的一个回归测试框架(归测试框架(regression testing framework),供供Java开发开发人员编写单元测试之用。人员编写单元测试之用。JUnit测试是程序员测试,即所谓白盒测试,因为程序员测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(知道被测试的软件如何(How)完成功能和完成什么样()完成功能和完成什么样(What)的功能。)的功能。JUnit本质上是一套框架,即开发者制定了本质上是一套框架,即开发者制定了

    9、一套条条框框,遵循这此条条框框要求编写测试代码,如继一套条条框框,遵循这此条条框框要求编写测试代码,如继承某个类,实现某个接口,就可以用承某个类,实现某个接口,就可以用JUnit进行自动测试了。进行自动测试了。由于由于JUnit相对独立于所编写的代码,可以测试代码的编相对独立于所编写的代码,可以测试代码的编写可以先于实现代码的编写,写可以先于实现代码的编写,“极限开发极限开发”中推崇的中推崇的“test first design”的实现有了现成的手段:用的实现有了现成的手段:用JUnit写测试代码,写测试代码,写实现代码,运行测试,测试失败,修改实现代码,再运行写实现代码,运行测试,测试失败,

    10、修改实现代码,再运行测试,直到测试成功。以后对代码的修改和优化,运行测试测试,直到测试成功。以后对代码的修改和优化,运行测试成功,则修改成功。成功,则修改成功。4.2.2 JUnit4.2.2 JUnit和和EclipseEclipse的关系的关系前面提到了前面提到了JUnit的作者的作者Erich Gamma,他同时还负责,他同时还负责了了Eclipse的开发,包括的开发,包括JFace的开发和的开发和JDT中一些工具的中一些工具的开发。开发。Kent Beck则是极限开发的倡导者,则是极限开发的倡导者,Eclipse中的不中的不少开发工具都体现了极限开发的思想。少开发工具都体现了极限开发的

    11、思想。Erich Gamma和和Kent Beck在在Eclipse项目的早期,写了多本关于项目的早期,写了多本关于Eclipse的的图书,推动了图书,推动了Eclipse的普及。的普及。Eclipse具有一个具有一个JUnit插件,这个插件已经包含在插件,这个插件已经包含在JDT中,实现了中,实现了JUnit的的GUI界面。这个界面由界面。这个界面由JUnit视图实现。视图实现。4.2.3 4.2.3 准备要测试的类准备要测试的类如何用好如何用好JUnit也是一门学问,本书的主题是也是一门学问,本书的主题是Eclipse插件的开发,所以不在此详细讨论插件的开发,所以不在此详细讨论JUnit的

    12、技巧。本节的例的技巧。本节的例子是演示一下子是演示一下Eclipse中如何应用中如何应用JUnit。这个例子也是取自。这个例子也是取自JUnit介绍的一个经典例子。在前面建立的项目介绍的一个经典例子。在前面建立的项目hello.pde中中新建一个包新建一个包hello.junit。在这个包中建立一个新的类。在这个包中建立一个新的类Money。4.2.4 4.2.4 为测试另外建立源代码文件夹为测试另外建立源代码文件夹下面这个步骤属于个人的编程习惯。通常用于测试的下面这个步骤属于个人的编程习惯。通常用于测试的代码是不随最终产品发布的,所以为了管理上的方便,把测代码是不随最终产品发布的,所以为了管

    13、理上的方便,把测试代码保存到另外一个源代码文件夹中。试代码保存到另外一个源代码文件夹中。4.2.5 4.2.5 新建单元测试新建单元测试建立好保存测试源代码的文件夹后,就可以开始建立建立好保存测试源代码的文件夹后,就可以开始建立单元测试了。一个单元测试用例是一个类。往往对应一个特单元测试了。一个单元测试用例是一个类。往往对应一个特定的待测类。在定的待测类。在JDT中建立单元测试是非常简单的。中建立单元测试是非常简单的。4.2.6 4.2.6 输入测试代码输入测试代码下面试着写一段测试代码。如下面代码那样,修改下面试着写一段测试代码。如下面代码那样,修改testAdd()方法,加入测试的代码。测

    14、试的过程是:先建立方法,加入测试的代码。测试的过程是:先建立两个两个Money对象,分别是对象,分别是m12CHF、m14CHF。m12CHF的数值是的数值是12,m14CHF的数值是的数值是14。然后调用。然后调用m12CHF的的add方法,与方法,与m14CHF相加,得出一个新的相加,得出一个新的Money对象对象result。最后用。最后用assertTrue方法,验证得出的方法,验证得出的result的值是的值是否与预期的否与预期的expected对象的值相等。对象的值相等。4.2.6 4.2.6 输入测试代码输入测试代码4.2.7 4.2.7 运行单元测试运行单元测试修改完成后,就可

    15、以试一下运行测试用例了。运行测修改完成后,就可以试一下运行测试用例了。运行测试用例也是试用例也是Run命令,通过工具栏上的命令,通过工具栏上的Run按钮执行。按钮执行。4.2.8 4.2.8 查看单元测试的结果查看单元测试的结果单元测试一旦执行,测试的结果就可以在单元测试一旦执行,测试的结果就可以在JUnit视图上视图上清晰地展现出来。清晰地展现出来。4.3 4.3 代码重构功能代码重构功能“好的文章是改出来的好的文章是改出来的”,同样,同样“好的软件也是改出来好的软件也是改出来的的”。软件开发是一个不断探索、不断尝试的过程,软件中。软件开发是一个不断探索、不断尝试的过程,软件中不完善的地方经

    16、常需要进行重构调整。不完善的地方经常需要进行重构调整。Eclipse为软件代码为软件代码的重构提供了大量便捷的功能。包括有:重命名、抽取方法的重构提供了大量便捷的功能。包括有:重命名、抽取方法、移动、内联功能、更改方法特征符等代码结构级别的重构、移动、内联功能、更改方法特征符等代码结构级别的重构。下面就来学习一下如何使用。下面就来学习一下如何使用Eclipse提供的这些功能快速提供的这些功能快速地修改软件代码。地修改软件代码。4.3.1 Eclipse4.3.1 Eclipse中的重构类型中的重构类型选择源代码后,可以看到选择源代码后,可以看到Eclipse的菜单栏出现了的菜单栏出现了Refa

    17、ctor的子菜单,展开的子菜单,展开Refactor菜单,是菜单各个命令的菜单,是菜单各个命令的说明。在源代码的编辑器中,按鼠标右键,弹出的快捷菜单说明。在源代码的编辑器中,按鼠标右键,弹出的快捷菜单也可以找到也可以找到Refactor的子菜单项,的子菜单项,Refactor子菜单中的命令子菜单中的命令会根据当前所选的对象变化,仅显示可用的操作。会根据当前所选的对象变化,仅显示可用的操作。通过通过Refactor的子菜单项,可以看到的子菜单项,可以看到Eclipse 的重构工的重构工具可以分为三大类:具可以分为三大类:对代码进行重命名以及改变代码的物理结构,包括对对代码进行重命名以及改变代码的

    18、物理结构,包括对属性、变量、类以及接口重新命名,还有移动包和类等。属性、变量、类以及接口重新命名,还有移动包和类等。改变类一级的代码逻辑结构,包括将匿名类转变为嵌改变类一级的代码逻辑结构,包括将匿名类转变为嵌套类,将嵌套类转变为顶级类、根据具体的类创建接口,以套类,将嵌套类转变为顶级类、根据具体的类创建接口,以及从一个类中将方法或者属性移到子类或者父类中。及从一个类中将方法或者属性移到子类或者父类中。4.3.2 4.3.2 类重命名类重命名类的重命名不是简单地修改文件名或者类的名称就可类的重命名不是简单地修改文件名或者类的名称就可以了,类的名称一旦修改,其他关联了或者应用了这个类的以了,类的名

    19、称一旦修改,其他关联了或者应用了这个类的代码也要作相应修改。代码也要作相应修改。Eclipse提供的重构功能可以自动帮提供的重构功能可以自动帮你完成这些修改工作。你完成这些修改工作。首先选择要修改的类,然后选择菜单首先选择要修改的类,然后选择菜单Refactor-Rename,或者按右键,弹出快捷菜单,选择,或者按右键,弹出快捷菜单,选择Refactor-Rename。4.3.3 4.3.3 包重命名包重命名包的重命名和修改类名的操作一样,也是先选择要修包的重命名和修改类名的操作一样,也是先选择要修改的包,然后选择菜单改的包,然后选择菜单Refactor-Rename。4.3.4 4.3.4

    20、类属性和方法重命名类属性和方法重命名修改属性名或者方法名可以直接在修改属性名或者方法名可以直接在Java 源代码编辑器源代码编辑器中执行。把光标定位在属性变量名上,按鼠标右键,弹出快中执行。把光标定位在属性变量名上,按鼠标右键,弹出快捷菜单,选择捷菜单,选择Refactor-name。4.3.4 4.3.4 类属性和方法重命名类属性和方法重命名4.3.5 4.3.5 移动类的位置移动类的位置移动类的位置主要是把某个类移动到另外一个包上,移动类的位置主要是把某个类移动到另外一个包上,相当于修改类的包。要移动类,把类拖拉到目标的包就可以相当于修改类的包。要移动类,把类拖拉到目标的包就可以了。了。4

    21、.3.6 4.3.6 抽取抽象类和接口抽取抽象类和接口首先选择要修改的类,然后选择菜单首先选择要修改的类,然后选择菜单Refactor-Extract Interface,或者按右键,弹出快捷菜单,选择,或者按右键,弹出快捷菜单,选择Refactor-Extract Interface。4.3.7 4.3.7 迁移属性或方法到父类迁移属性或方法到父类在在MoneyImplement类中添加一个方法类中添加一个方法getName()。当。当然这个方法没有什么特别的意义,在这里只是为了迁移方法然这个方法没有什么特别的意义,在这里只是为了迁移方法到父类的功能。到父类的功能。public String

    22、 getName()return;4.3.8 4.3.8 提取匿名类提取匿名类在程序开发初期,为了开发方便,经常会使用匿名类。在程序开发初期,为了开发方便,经常会使用匿名类。随着程序的修改,要求的功能增强,匿名类中的代码可能随随着程序的修改,要求的功能增强,匿名类中的代码可能随之增多;或者某个匿名类中的功能需要做成可重用的类。这之增多;或者某个匿名类中的功能需要做成可重用的类。这时候就可以考虑把匿名类提取出来,建立成独立的类了。时候就可以考虑把匿名类提取出来,建立成独立的类了。4.3.9 4.3.9 把内建类变成顶级类把内建类变成顶级类JDT可以识别匿名类所需要的变量或者属性,建立内建可以识别

    23、匿名类所需要的变量或者属性,建立内建类的时候,会建立对应的构造方法。但是这里需要的不是一类的时候,会建立对应的构造方法。但是这里需要的不是一个内建类,而是一个独立的顶级类。那么就可以在建立了内个内建类,而是一个独立的顶级类。那么就可以在建立了内建类的基础上再进一步,把内建类变成顶级类。建类的基础上再进一步,把内建类变成顶级类。4.4 4.4 高级辅助功能高级辅助功能Eclipse JDT还提供了丰富的辅助功能提升编写代码的还提供了丰富的辅助功能提升编写代码的效率,前面接触过一些:像优化包的导入、代码美化、代码效率,前面接触过一些:像优化包的导入、代码美化、代码提示、自动补全等等。下面将学习更高

    24、级的辅助功能:包括提示、自动补全等等。下面将学习更高级的辅助功能:包括方法的重载辅助、建立方法的重载辅助、建立getter、setter、建立委派模式、对、建立委派模式、对类的成员进行排序等等。类的成员进行排序等等。4.4.1 JDT4.4.1 JDT提供的源代码辅助功能提供的源代码辅助功能JDT提供的源代码辅助功能基本上位于菜单提供的源代码辅助功能基本上位于菜单Source中中,大概可以分成下面几类:,大概可以分成下面几类:注释的管理,包括:自动建立注释,添加注释,删除注释的管理,包括:自动建立注释,添加注释,删除注释,添加块注释。注释,添加块注释。代码的格式化,最常用的就是对整篇代码重新整

    25、理。代码的格式化,最常用的就是对整篇代码重新整理。对对Import的管理,自动加入的管理,自动加入Import,整理,整理Import等等等等。继承、重载相关的源代码辅助功能。继承、重载相关的源代码辅助功能。块代码的辅助,加入块代码的辅助,加入try catch建立异常捕捉。建立异常捕捉。建立文本的国际化。建立文本的国际化。4.4.2 4.4.2 方法重载辅助方法重载辅助在面向对象开发中,重载方法是经常需要做的工作。在面向对象开发中,重载方法是经常需要做的工作。JDT提供了重载的向导,可以更方便快捷地实现重载。在前提供了重载的向导,可以更方便快捷地实现重载。在前面面Money2的基础上,重载父

    26、类的基础上,重载父类MoneyImplement的几个方的几个方法。法。4.4.3 4.4.3 生成生成gettergetter和和settersetter根据根据JavaBean的规范,类中的属性通常都是一个私有的规范,类中的属性通常都是一个私有的字段变量,对应有的字段变量,对应有getter方法和方法和setter方法。如果是方法。如果是“只只读读”属性,那么只有属性,那么只有getter方法,没有方法,没有setter方法;如果是方法;如果是“只写只写”属性,只有属性,只有setter方法,没有方法,没有getter方法。方法。JDT也提供了辅助功能,可以快速地建立也提供了辅助功能,可以

    27、快速地建立getter、setter方法。按照下面的代码,在方法。按照下面的代码,在Money2中加入几个字段中加入几个字段变量。变量。public class Money2 extends MoneyImplement private String country;private String bank;private boolean enable=false;4.4.4 4.4.4 建立委派模式(建立委派模式(DelegateDelegate)委派模式委派模式(Delegate)是面向对象设计模式中常用的一种是面向对象设计模式中常用的一种模式。这种模式的原理是类模式。这种模式的原理是类B和

    28、类和类A是两个互相没有任何是两个互相没有任何“血缘血缘”关系的类,关系的类,B具和具和A一模一样的方法或者属性;并且一模一样的方法或者属性;并且B中的方法、属性就是调用中的方法、属性就是调用A的同名方法或者属性。的同名方法或者属性。B就好就好像是一个受像是一个受A授权委托的中介。第三方的代码不需要知道授权委托的中介。第三方的代码不需要知道A的存在,也不需要和的存在,也不需要和A直接关联,通过直接关联,通过B就可以使用到就可以使用到A的的功能。功能。4.4.5 4.4.5 对类成员进行排序对类成员进行排序代码在经过不断的修改,不断地加入各种字段变量、代码在经过不断的修改,不断地加入各种字段变量、

    29、属性、方法后,往往会变得比较混乱。虽然属性、方法后,往往会变得比较混乱。虽然Eclipse中有中有JDT提供的概览视图,可以快速地定位到指定的对象上。但提供的概览视图,可以快速地定位到指定的对象上。但还是要考虑一下不依赖工具时候,也能方便地阅读源代码。还是要考虑一下不依赖工具时候,也能方便地阅读源代码。我们一直都要坚持我们一直都要坚持“代码即文档代码即文档”的原则,尽量让文档便于的原则,尽量让文档便于阅读。前面我们知道阅读。前面我们知道JDT提供了快速格式化的功能,可以把提供了快速格式化的功能,可以把代码的版面编排整齐。代码的版面编排整齐。JDT还提供了一个对类成员进行排序还提供了一个对类成员

    30、进行排序的功能,让字段变量、属性、方法按照指定的顺序排列,方的功能,让字段变量、属性、方法按照指定的顺序排列,方便阅读。便阅读。4.4.6 4.4.6 建立建立trycatchtrycatch捕捉异常也是捕捉异常也是Java开发中经常要处理的问题。开发中经常要处理的问题。4.5 4.5 小结小结本章的内容比较多,涉及了本章的内容比较多,涉及了Java开发过程的多个方面开发过程的多个方面的高级应用。包括项目的构建,的高级应用。包括项目的构建,Java代码的调试技术,单代码的调试技术,单元测试技术,元测试技术,Java代码的重构,以及各种高级的辅助功能代码的重构,以及各种高级的辅助功能。JDT的构建功有的构建功有“手动构建手动构建”和和“自动构建自动构建”两种模式两种模式。自动构建,是在开发者编辑代码的过程中就同步实行项目。自动构建,是在开发者编辑代码的过程中就同步实行项目的构建。所以在开发过程中就可以及时地发现构建错误。自的构建。所以在开发过程中就可以及时地发现构建错误。自动构建是后台的一个线程,有时候会影响前台的开发效率。动构建是后台的一个线程,有时候会影响前台的开发效率。这时候可以选择这时候可以选择“手动构建手动构建”,在认为需要的时候才构建整,在认为需要的时候才构建整个项目。个项目。

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:第4章-高级Java开发技术-《Eclipse从入门到精通》教学课件-课件.ppt
    链接地址:https://www.163wenku.com/p-4853434.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库