<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    weidagang2046的專(zhuān)欄

    物格而后知致
    隨筆 - 8, 文章 - 409, 評(píng)論 - 101, 引用 - 0
    數(shù)據(jù)加載中……

    Eclipse插件開(kāi)發(fā)快速入門(mén)

      剛才我在修理自己的汽車(chē),我需要擰下一個(gè)螺絲。于是我打開(kāi)自己的扳手工具包,試圖找到合適的扳手。但是那些扳手的型號(hào)都不對(duì),因?yàn)槟莻€(gè)螺絲都屬于公制標(biāo)準(zhǔn)的。我只能使用與理想尺寸最相近的扳手。這是一個(gè)不好的想法;結(jié)果我把那個(gè)螺絲弄裂了,只好去買(mǎi)一個(gè)專(zhuān)用的工具來(lái)下掉它。這個(gè)故事的精髓是:實(shí)現(xiàn)特定的事務(wù)永遠(yuǎn)需要使用恰當(dāng)?shù)墓ぞ?/B>。

      Eclipse是一個(gè)非常流行的Java集成開(kāi)發(fā)環(huán)境(IDE),它是NetBeans/SunOne Studio、Jbuilder、和IntelliJ IDEA的強(qiáng)有力的競(jìng)爭(zhēng)者。Java程序員群體正在迅速地遷移到Eclipse上,因?yàn)樗敲赓M(fèi)的、開(kāi)放源代碼的、質(zhì)量很好,而且非常容易定制。

      本文的內(nèi)容是如何在Eclipse中編寫(xiě)插件(plugin)。本文的目標(biāo)讀者是哪些人呢?很多Eclipse用戶(hù)簡(jiǎn)單地使用IDE而不需要進(jìn)行定制;很多人會(huì)使用他人建立的插件,這些人不是本文的目標(biāo)讀者。有些用戶(hù)希望定制Eclipse;有些人將為他們公司的雇員開(kāi)發(fā)工具;有些人希望銷(xiāo)售與自己的產(chǎn)品相關(guān)的工具;還有一些人希望使用其它名稱(chēng)轉(zhuǎn)售預(yù)安裝了某些工具的Eclipse。這些人組成了本文的目標(biāo)受眾。開(kāi)始編寫(xiě)Eclipse插件的前提條件是了解如何使用Eclipse和編寫(xiě)Java程序,并且對(duì)標(biāo)準(zhǔn)Widget工具包(SWT)有很好的理解。

      安裝Eclipse

      如果你已經(jīng)使用了Eclipse 3,那么可以跳過(guò)這一段落。如果沒(méi)有安裝該軟件,你首先需要下載和安裝它。你可以簡(jiǎn)單地從Eclipse下載頁(yè)面下載最新的穩(wěn)定版本,接著把下載的文件解壓到一個(gè)文件夾中(例如c:\dev)。在寫(xiě)作本文的時(shí)候,這個(gè)文件是eclipse-SDK-3.0.1-win32.zip(85MB)。這個(gè)過(guò)程會(huì)建立c:\dev\eclipse文件夾。

      請(qǐng)注意,在這個(gè)文件夾下已經(jīng)有一個(gè)叫做plugins的文件夾了。你可以快速瀏覽一下,會(huì)發(fā)現(xiàn)很多的已經(jīng)安裝好的插件。這是怎么回事呢?因?yàn)镋clipse的核心相對(duì)較小,幾乎每個(gè)部分都是一個(gè)插件。

      架構(gòu)

      Eclipse由一個(gè)很小的核心和核心之上的大量插件組成。有些插件僅僅是供其它插件使用的庫(kù)。其中存在很多你可以利用的工具。所有插件使用的基礎(chǔ)庫(kù)是:

      · 標(biāo)準(zhǔn)Widget工具包(SWT):Eclipse中處處使用的圖形化組件:按鈕,圖像、光標(biāo)、標(biāo)簽等等。布局管理類(lèi)。通常這個(gè)庫(kù)被用于代替Swing。

      · JFace:菜單、工具條、對(duì)話框、參數(shù)選擇、字體、圖像、文本文件的類(lèi)和向?qū)Щ?lèi)。

      · 插件開(kāi)發(fā)環(huán)境(PDE):輔助數(shù)據(jù)操作、擴(kuò)展、建立過(guò)程和向?qū)У念?lèi)。

      · Java開(kāi)發(fā)者工具包(JDT):用于編程操作Java代碼的類(lèi)。

      上面的每一個(gè)類(lèi)都有自己專(zhuān)有的功能,其中一些還可以單獨(dú)使用(盡管它們內(nèi)在地依賴(lài)于其它類(lèi))。例如,SWT不僅僅只用于插件;它還可以被用于建立非Eclipse的、獨(dú)立的應(yīng)用程序。還有一些其它的庫(kù)沒(méi)有被列舉出來(lái)。

      圖1顯示了Eclipse不同層次之間的關(guān)系。


    圖1:分層的類(lèi)庫(kù)


      安裝GEF和Draw2D運(yùn)行時(shí)

      在默認(rèn)情況下,這兩個(gè)面向?qū)ο蟮膸?kù)(圖形化編輯器框架組件GEF和Draw2D)是沒(méi)有被安裝的。在本文中我們需要利用它們,因此首先需要安裝它們。你可以在GEF主頁(yè)面下載GEF和Draw2D,下載3.0.1或以后版本,把文件保存為GEF-SDK-3.0.1.zip(5.5MB)。把這個(gè)文件解壓到Eclipse文件夾下(這是包含plugins子文件夾的文件夾)。這兩個(gè)庫(kù)自身也是作為插件加進(jìn)來(lái)的。

      這些庫(kù)提供了什么樣的功能?它們構(gòu)成了建立圖形化插件的基礎(chǔ)。圖形化插件通常顯示一些對(duì)象(例如方框和標(biāo)簽,用線和箭頭鏈接在一起)。這些對(duì)象和連接器的繪制都是由Draw2D來(lái)處理的。但是繪制過(guò)程僅僅是圖形化編輯器實(shí)現(xiàn)的一半功能。另一半--編輯器命令、工具條、拖放功能、打印--由GEF來(lái)完成。

       配置PDE選項(xiàng)

      安裝上述的各種部件之后,下一步就是定制或至少是熟悉插件配置選項(xiàng)。這些選項(xiàng)在菜單窗體 -> 選項(xiàng)的"插件開(kāi)發(fā)"類(lèi)別下選擇。瀏覽一下插件用到的數(shù)以十計(jì)的配置選項(xiàng)。你可以特地看一下Target Environment(目標(biāo)環(huán)境)類(lèi)別。它允許我們選擇默認(rèn)的操作系統(tǒng)、視窗(windowing)系統(tǒng)、CPU架構(gòu)和語(yǔ)言。

      我們感興趣的還有Plug-in Development(插件開(kāi)發(fā))透視圖(透視圖是一組視圖參數(shù)選擇,包括面板、視圖、工具條等等,根據(jù)不同的事務(wù)發(fā)生改變,可以把它看出Eclipse中的"模式")。通過(guò)選擇菜單中的窗口-> 打開(kāi)透視圖 -> 其它,然后在列表中選擇"插件開(kāi)發(fā)"就可以看到它了。它與Java透視圖相似,但是擁有一個(gè)插件視圖,可以顯示所有檢測(cè)到的插件。圖2顯示了如何激活這個(gè)透視圖,并顯示了該透視圖。


    圖2:插件開(kāi)發(fā)透視圖
      建立一個(gè)簡(jiǎn)單插件

      建立插件最簡(jiǎn)單的辦法是使用文件-> 新建->插件項(xiàng)目向?qū)峁┑哪0濉=又斎胍粋€(gè)項(xiàng)目名稱(chēng)(例如"Invokatron")。這是什么意思呢?我們將建立的插件是Invokatron,它是一個(gè)供Java代碼使用的代碼生成圖形化編輯器。本文刪除了Invokatron的路徑,但是很明顯這個(gè)雄心勃勃的項(xiàng)目直到下次安裝時(shí)才會(huì)完成。

      在"下一步"頁(yè)面上,除了類(lèi)名之外其它的選項(xiàng)都不變,類(lèi)名輸入invokatron.InvokatronPlugin。在"插件內(nèi)容"頁(yè)面上,輸入你認(rèn)為適合的任何信息。在"模板"頁(yè)面上,選中檢查框以激活模板。我們可以在多個(gè)模板中進(jìn)行選擇:

      · Hello, World

      · 簡(jiǎn)單的XML編輯器

      · 多頁(yè)面編輯器和向?qū)?BR>
      · 透視圖擴(kuò)展

      · 彈出菜單

      · 屬性頁(yè)面

      · 視圖

      · 擁有前面的一個(gè)或多個(gè)數(shù)據(jù)項(xiàng)的自定義插件

      對(duì)于本文的示例,我們使用自定義插件模板。選擇"多頁(yè)面編輯器"-"新建文件向?qū)?-"屬性"頁(yè)面。在"下一步"頁(yè)面輸入下面一些值:
    "多頁(yè)面編輯器"頁(yè)面(圖3所示):

      · Java程序包名稱(chēng):invokatron.editor

      · 編輯器類(lèi)名稱(chēng):InvokatronEditor

      · 編輯器輔助類(lèi)名稱(chēng):InvokatronEditorContributor

      · 編輯器名稱(chēng):Invokatron Editor

      · 文件擴(kuò)展名:invokatron


    圖3:"多頁(yè)面編輯器"設(shè)置

      "新建向?qū)?頁(yè)面(圖4所示):

      · Java程序包名稱(chēng):invokatron.wizard

      · 向?qū)ь?lèi)別ID:Invokatron

      · 向?qū)ь?lèi)別名稱(chēng):Invokatron Wizard

      · 向?qū)ь?lèi)名稱(chēng): InvokatronWizard

      · 向?qū)ы?yè)面類(lèi)名稱(chēng):InvokatronWizardPage

      · 向?qū)Q(chēng):Invokatron Wizard

      · 文件擴(kuò)展名: invokatron

      · 初始文件名: MyClass.invokatron


    圖4:"新建向?qū)?設(shè)置

      "屬性"頁(yè)面(圖5所示):

      · Java程序包名稱(chēng):invokatron.properties

      · 屬性頁(yè)面類(lèi): InvokatronPropertyPage

      · 屬性頁(yè)面名稱(chēng):Invokatron Properties

      · 目標(biāo)類(lèi):org.eclipse.core.resources.IFile

      · 文件名過(guò)濾器:*.*


    圖5:"屬性"頁(yè)面設(shè)置

      這個(gè)時(shí)候Eclipse生成了大量的文件:

      · plugin.xml:描述該插件的主文件。它包含了輔助代碼生成、庫(kù)、插件依賴(lài)關(guān)系和擴(kuò)展指向的一些信息。

      · build.properties:用于描述建立(build)過(guò)程的文件。它主要用于指定需要的庫(kù)。

      · invokatron/*.java:插件類(lèi)。

      · sample.gif:菜單項(xiàng)顯示的圖標(biāo)。

      plugin.xml文件和build.properties一起被顯示在多頁(yè)面編輯器中。第一個(gè)頁(yè)面("預(yù)覽")允許你在測(cè)試環(huán)境中導(dǎo)出和運(yùn)行該插件。"導(dǎo)出"的意思是通過(guò)生成一些代碼、接著編譯和打包來(lái)完善該插件。

      查看一下類(lèi),你會(huì)發(fā)現(xiàn)它實(shí)際上沒(méi)有做什么操作。添加菜單選項(xiàng)的代碼在哪兒呢?框架組件從plugin.xml文件包含的信息中簡(jiǎn)單地生成了必要的代碼。你可以查看一下這個(gè)文件。它的最后一部分包含了一個(gè)擴(kuò)展列表,這是這些類(lèi)可以插入Eclipse的地方。

      上面過(guò)程中產(chǎn)生的項(xiàng)目是示例代碼的一部分,你可以下載。

      運(yùn)行和調(diào)試

      你可以在一個(gè)特殊的沙盒(sandbox)--運(yùn)行時(shí)工作臺(tái)(runtime workbench)中測(cè)試自己的插件。使用這種方式的時(shí)候,即使運(yùn)行時(shí)工作臺(tái)崩潰了,Eclipse仍然能夠工作。通過(guò)點(diǎn)擊"預(yù)覽"頁(yè)面上的"載入運(yùn)行時(shí)工作臺(tái)"或"在調(diào)試模式中載入運(yùn)行時(shí)工作臺(tái)"鏈接。第一次運(yùn)行運(yùn)行時(shí)工作臺(tái)的時(shí)候,會(huì)建立eclipse\runtime-workbench-workspace文件夾。它會(huì)啟動(dòng)一個(gè)新的Eclipse實(shí)例,該實(shí)例與正常的Eclipse窗口非常相似(除了你的插件可以使用了之外)。

      但是你還是首先選擇文件 -> 新建 -> 項(xiàng)目菜單和Java項(xiàng)目來(lái)建立一個(gè)Java項(xiàng)目。這個(gè)項(xiàng)目的名稱(chēng)叫做Test。圖6顯示了帶有我們建立的向?qū)Ш途庉嬈鞯倪\(yùn)行時(shí)工作臺(tái)。


    圖6:運(yùn)行該插件

      現(xiàn)在我們看一下Invokatron向?qū)А牟藛挝募?>新建 -> 其它 可以看到它。查看類(lèi)別Invokatron向?qū)А_x擇Invokatron向?qū)В又c(diǎn)擊"下一步"。這個(gè)向?qū)?huì)建立一個(gè)空的Invokatron文檔。在Container(容器)字段中選擇Test項(xiàng)目并點(diǎn)擊"完成"。一個(gè)新的Invokatron編輯器顯示出來(lái)了。這個(gè)編輯器有三個(gè)頁(yè)面:一個(gè)文本編輯頁(yè)面、一個(gè)屬性頁(yè)面(字體選擇)和一個(gè)預(yù)覽頁(yè)面(排序的、用選擇的字體繪制的)。

      支持文件

      你可以在很多位置指定自己的插件在編譯和運(yùn)行時(shí)所需要的文件。這使我們這些Eclipse用戶(hù)感到很困惑。我們?cè)噲D澄清這些問(wèn)題。

      支持文件分為三類(lèi):

      1、來(lái)自插件代碼自身的類(lèi)和資源。它們?cè)诮⑦^(guò)程中就會(huì)被打包為一個(gè)或多個(gè).jar文件。

      2、編譯和運(yùn)行插件所需要的類(lèi)和資源。它們都應(yīng)該被包含在類(lèi)路徑中,并且我們必須指明在導(dǎo)出的時(shí)候需要復(fù)制這些文件。

      3、與插件一起包含進(jìn)來(lái)的文件(例如readme.txt文件)。它們不在類(lèi)路徑中。

      在插件編輯器的"建立(Build)"頁(yè)面中可以設(shè)置編譯環(huán)境。此外,這些設(shè)置會(huì)映射為build.properties文件。在第一次看到這個(gè)頁(yè)面的時(shí)候我們可能會(huì)感到困惑,因?yàn)樗兴膫€(gè)分開(kāi)的部分:

      · 運(yùn)行時(shí)信息:列出了生成的庫(kù)文件(第1類(lèi)文件)。通常,在一個(gè)庫(kù)文件中包含了插件所需要的所有類(lèi),但是你可能希望把它分割成更小的塊。

      · Source Build:列出應(yīng)該被包含到.jar文件中的類(lèi)文件(第1類(lèi)文件的輸入)

      · Binary Build:列出應(yīng)該被復(fù)制到導(dǎo)出的插件文件夾或檔案文件中的文件(第3類(lèi)文件)。上面的選擇框被選中的時(shí)候,生成的文件會(huì)被自動(dòng)地包含進(jìn)來(lái)。

      · 精確的類(lèi)路徑項(xiàng):列出了在編譯時(shí)刻你的應(yīng)用程序所需要的.jar文件(第2類(lèi)文件)。這些文件會(huì)被自動(dòng)地添加到你的項(xiàng)目庫(kù)中。我們通常容易犯的一個(gè)錯(cuò)誤是在"屬性"頁(yè)面中的"Java建立路徑"中和這個(gè)列表中同時(shí)包含了某個(gè).jar文件。

      如果你的插件使用了某個(gè)特殊的庫(kù),就必須確保把這個(gè)庫(kù)添加到項(xiàng)目中。接著把它添加到Source Build和精確的類(lèi)路徑項(xiàng)中。

      插件編輯器的其它一些重要的屬性頁(yè)面有:

      · 依賴(lài)關(guān)系(Dependencies):如果你的插件依賴(lài)于其它的插件,你就必須在這兒指定。

      · 運(yùn)行時(shí)(Runtime):在這個(gè)屬性頁(yè)面中你可以為插件指定特殊行為。
      導(dǎo)出

      插件編碼完成了,并且在工作臺(tái)中測(cè)試過(guò)之后,就該準(zhǔn)備部署到"真實(shí)的" Eclipse環(huán)境中了。要實(shí)現(xiàn)這個(gè)步驟,需要返回"預(yù)覽"頁(yè)面并點(diǎn)擊"導(dǎo)出向?qū)?鏈接。"導(dǎo)出選項(xiàng)"對(duì)話框允許你從三種部署類(lèi)型中選擇一個(gè):

      · 目錄結(jié)構(gòu):把文件部署到一個(gè)目錄中供Eclipse立即使用。接著你可以把目標(biāo)位置(Destination)設(shè)置為本地的Eclipse文件夾(例如c:\dev\eclipse),直接地使用插件。

      · 單個(gè).zip文件:相同的文件夾會(huì)被壓縮為一個(gè).zip文件,準(zhǔn)備好發(fā)布給客戶(hù)。接下來(lái),你必須把這個(gè)文件解壓到Eclipse最上層的文件夾來(lái)安裝插件。你必須在文件名字段中指定.zip文件名。

      · 更新站點(diǎn)使用的獨(dú)立.jar文檔文件:產(chǎn)生一個(gè)與Eclipse用于自動(dòng)更新系統(tǒng)相兼容的.jar文件。

      你點(diǎn)擊"完成"之后,會(huì)生成我們選中的輸出。如果你把輸出作為目錄結(jié)構(gòu),就必須重新啟動(dòng)Eclipse以激活該插件。

      查看示例和源代碼

      關(guān)于如何編寫(xiě)Eclipse插件的最好信息來(lái)源是Eclipse所提供的插件示例集。如果我只能選擇一個(gè)輔助自己編寫(xiě)插件的信息來(lái)源,我一定選擇它。

      如果你要下載這些插件,只需要訪問(wèn)Eclipse下載頁(yè)面并選擇最新的版本。接著看這個(gè)頁(yè)面的中間,有一個(gè)"示例插件",請(qǐng)下載這些.zip文件(小于2MB)。把這些文件解壓到Eclipse所在的文件夾(例如c:\dev)中。這個(gè)步驟會(huì)在eclipse/features和eclipse/plugins下建立很多文件夾。這些示例的源代碼在C:\dev\eclipse\plugins文件夾的大量.zip文件中,如下所示:

    示例 代碼位置
    SWT示例 在org.eclipse.sdk.examples.source_3.0.1\src...文件夾下
    獨(dú)立的  
    · 地址薄
    · 剪貼板
    · 文件查看器
    · Hello World
    · 懸浮幫助
    · 圖像分析器
    · Java語(yǔ)法查看器
    · 文本編輯器
    ...\org.eclipse.swt.examples_3.0.0\swtexamplessrc.zip 與工作臺(tái)集成的
    · 瀏覽器 ...\org.eclipse.swt.examples.browser_3.0.0\ browserexamplesrc.zip
    · 控件 ...\org.eclipse.swt.examples.controls_3.0.0\controlssrc.zip
    · SWT載入程序 ...\org.eclipse.swt.examples.launcher_3.0.0\launchersrc.zip
    · 布局 ...\org.eclipse.swt.examples.layouts_3.0.0\layoutssrc.zip
    · 繪圖 ...\org.eclipse.swt.examples.paint_3.0.0\paintsrc.zip
    · OLE 特殊文件夾:
    org.eclipse.sdk.examples.source.win32.win32.x86_3.0.1\ src\org.eclipse.swt.examples.ole.win32_3.0.0\ olewin32src.zip
    工作臺(tái)示例  
    · Java編輯器 ...\org.eclipse.ui.examples.javaeditor_3.0.0\ javaeditorexamplesrc.zip
    · 模板編輯器 ...\org.eclipse.ui.examples.javaeditor_3.0.0\ templateeditorexamplesrc.zip
    · 多頁(yè)面編輯器 ...\org.eclipse.ui.examples.multipageeditor_2.1.0<\ multipageeditorsrc.zip
    · 屬性表 ...\org.eclipse.ui.examples.propertysheet_2.1.0\ propertysheetsrc.zip
    · Readme工具 ...\org.eclipse.ui.examples.readmetool_2.1.0\readmetoolsrc.zip
    幫助示例 特殊文件夾:
    org.eclipse.help.examples.ex1_3.0.0(沒(méi)有Java文件;HTML在doc.zip之中)
    Team示例  
    · 知識(shí)庫(kù)提供程序
    · 同步共享
    ...\org.eclipse.team.examples.filesystem_3.0.0\ teamfilesystemsrc.zip
    文件比較示例  
    · 結(jié)構(gòu)比較 ...\org.eclipse.compare.examples_3.0.0\ compareexamplessrc.zip
    · XML比較 ...\org.eclipse.compare.examples.xml_3.0.0\ xmlcompareexamplessrc.zip
      
      還存在一些GEF和Draw2D插件的有用示例。你可以訪問(wèn)GEF頁(yè)面并下載最新版本。在版本發(fā)布頁(yè)面中間有"GEF示例",請(qǐng)下載該.zip文件。在寫(xiě)作本文的時(shí)候,該文件是GEF-examples-3.0.1.zip(0.5MB)。把這個(gè)文件解壓到Eclipse所在的文件夾中。你將看到下面兩個(gè)示例:

    示例 代碼位置
    · 邏輯圖表示例 org.eclipse.gef.examples.source_3.0.1\src\ org.eclipse.gef.examples.logic_3.0.0\logicsrc.zip
    · 流圖表示例 org.eclipse.gef.examples.source_3.0.1\src\ org.eclipse.gef.examples.flow_3.0.1\flowsrc.zip

      查找插件開(kāi)發(fā)的信息

      你首先查看的位置應(yīng)該是本文前面部分中的示例。其次還有幫助系統(tǒng),它的質(zhì)量也非常高。相關(guān)的內(nèi)容還有:

      · 平臺(tái)插件開(kāi)發(fā)

      · JTD插件開(kāi)發(fā)

      · PDE指導(dǎo)

      · Draw2D開(kāi)發(fā)者指導(dǎo)

      · GEF開(kāi)發(fā)者指導(dǎo)

      結(jié)論

      現(xiàn)在你已經(jīng)有了建立Eclipse圖形化插件的足夠信息了。有了這么多類(lèi)庫(kù)的幫助,只有你的想象力會(huì)限制你的作為了。其秘訣在于你要知道自己能夠使用那些工具,并且使用正確的工具完成適當(dāng)?shù)墓ぷ鳌?/SPAN>

    posted on 2005-05-24 19:23 weidagang2046 閱讀(721) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Java

    主站蜘蛛池模板: 黄色片在线免费观看| 亚洲精品无码国产| 久久国产乱子伦精品免费午夜| 亚洲国产精品VA在线看黑人 | 两个人看www免费视频| 久久精品蜜芽亚洲国产AV| 手机看片久久国产免费| 久久精品国产免费一区| 激情小说亚洲图片| 亚洲酒色1314狠狠做| 亚洲AⅤ永久无码精品AA| 91精品视频在线免费观看| 日本高清不卡中文字幕免费| 亚洲精品国产手机| 亚洲人成无码网WWW| 99在线精品免费视频九九视| 久久免费99精品国产自在现线 | 一个人看的免费观看日本视频www| 亚洲成a人片毛片在线| 久久久无码精品亚洲日韩软件| 91成年人免费视频| 中文字幕一区二区免费| 国产偷国产偷亚洲高清人| 亚洲国产精品无码久久久| 亚洲大尺度无码无码专区| 全亚洲最新黄色特级网站| 一个人在线观看视频免费 | 在线a亚洲v天堂网2019无码| 女性无套免费网站在线看| 最近中文字幕大全中文字幕免费| 免费夜色污私人影院网站| 亚洲日韩亚洲另类激情文学| 亚洲男女一区二区三区| 国产AV无码专区亚洲AV男同 | 亚洲成AV人片一区二区| 亚洲精品国自产拍在线观看| 免费网站看v片在线香蕉| 成视频年人黄网站免费视频| 30岁的女人韩剧免费观看| 日本人成在线视频免费播放| 国产成人精品免费视频大全|