国内成人精品,亚洲欧美一区二区视频,中文字幕一区二http://www.aygfsteel.com/xujun7/zh-cnTue, 24 Jun 2025 15:07:32 GMTTue, 24 Jun 2025 15:07:32 GMT60EJB與JavaBean的區別http://www.aygfsteel.com/xujun7/archive/2010/05/24/321739.htmleric_xueric_xuMon, 24 May 2010 08:08:00 GMThttp://www.aygfsteel.com/xujun7/archive/2010/05/24/321739.htmlhttp://www.aygfsteel.com/xujun7/comments/321739.htmlhttp://www.aygfsteel.com/xujun7/archive/2010/05/24/321739.html#Feedback0http://www.aygfsteel.com/xujun7/comments/commentRss/321739.htmlhttp://www.aygfsteel.com/xujun7/services/trackbacks/321739.html
1.EJB用于服務端應用開發, 而JavaBeans用于客戶端應用開發
也可以使用JavaBeans進行服務端應用開發,但JavaBeans模型沒有提供服務框架,當應用需要使用系統級服務(如事務管理,安全性,生命周期管理等)時,不適合。

2.EJB構件是可部署的,EJB構件可以作為獨立的單元被部署到EJB應用服務器上,是應用構件(application components),而JavaBeans構件是不可部署的, JavaBeans構件是開發構件,不能被部署為獨立的單元。

3.EJB構件是部署可定制的,使用部署描述符可以在部署EJB時對其運行時配置進行定制,而JavaBeans構件在部署時不能進行定制,JavaBeans構件的定制僅發生在開發階段,只能利用開發工具創建并組裝JavaBeans構件,部署時不能定制

4.EJB構件是分布式對象,可以被客戶應用或者其它EJB構件進行遠程訪問,而JavaBeans構件不是分布式對象,JavaBeans構件只能在其構成的應用中使用,不能提供遠程訪問能力

5.EJB構件對終端用戶不可見,運行在服務端,沒有人機交互界面,而部分JavaBeans構件對終端用戶可見,如GUI應用中使用的按鈕構件

eric_xu 2010-05-24 16:08 發表評論
]]>
Core Java學習筆記 對象和類http://www.aygfsteel.com/xujun7/archive/2010/05/17/321190.htmleric_xueric_xuMon, 17 May 2010 08:27:00 GMThttp://www.aygfsteel.com/xujun7/archive/2010/05/17/321190.htmlhttp://www.aygfsteel.com/xujun7/comments/321190.htmlhttp://www.aygfsteel.com/xujun7/archive/2010/05/17/321190.html#Feedback0http://www.aygfsteel.com/xujun7/comments/commentRss/321190.htmlhttp://www.aygfsteel.com/xujun7/services/trackbacks/321190.html任何對象變量的值都是對一個對象的引用。

顯示參數和隱式參數。

class Employee

{

   . . .

   private final String name;

}

private final Date hiredate;

final應用于基本數據類型,表示值不可變,應用于類對象,表示對象的引用不可變。

一個引用不能改變作為參數的基本類型數據,但能改變對象,因為傳入的參數是對象的引用,不能改變對象引用。

main()是一個程序執行的入口,系統必須先進入這個入口,也就是先要調用main()函數,才能繼續程序的執行,如果main()不用static修飾,系統就沒法進行調用,因為一開始系統不能創建任何對象。而加上了static后,系統就可以直接調用main()函數了,從而繼續程序的執行。 

public static void swap(Employee x, Employee y) // doesn't work
{
   Employee temp = x;
   x = y;
   y = temp;
}
Employee a = new Employee("Alice", . . .);
Employee b = new Employee("Bob", . . .);
swap(a, b);
a,b的引用沒有改變。
 
一個方法不能改變一個基本類型的參數
一個方法可以改變一個對象參數的狀態
一個方法不能讓對象參數引用一個新對象

默認值:數值為0,對象為null,布爾型為false

public Employee(String name, double salary)
{
   this.name = name;
   this.salary = salary;
}

This指示隱式參數,即被構造的類對象。

public Employee(double s)
{
   // calls Employee(String, double)
   this("Employee #" + nextId, s);
   nextId++;
}

This將調用同一個類的另一個構造函數。

初始化塊
// static initialization block
static
{
   Random generator = new Random();
   nextId = generator.nextInt(10000);
}

可以為任何一個類添加finalize方法,finalize方法將在垃圾回收器清除對象之前被調用。因為某些對象使用了內存之外的其他資源,如文件。



eric_xu 2010-05-17 16:27 發表評論
]]>
Core Java學習筆記 內部類http://www.aygfsteel.com/xujun7/archive/2010/05/16/321112.htmleric_xueric_xuSun, 16 May 2010 13:26:00 GMThttp://www.aygfsteel.com/xujun7/archive/2010/05/16/321112.htmlhttp://www.aygfsteel.com/xujun7/comments/321112.htmlhttp://www.aygfsteel.com/xujun7/archive/2010/05/16/321112.html#Feedback0http://www.aygfsteel.com/xujun7/comments/commentRss/321112.htmlhttp://www.aygfsteel.com/xujun7/services/trackbacks/321112.html內部類是定義在一個類內部的類。

內部類方法可以訪問該類定義所在的作用域的數據,包括私有數據。

內部類對同一包中的其他類不可見。

使用內部類定義回調函數可以避免寫大量代碼。

class TalkingClock

{

   public TalkingClock(int interval, boolean beep) { . . . }

   public void start() { . . . }

   private int interval;

   private boolean beep;

   private class TimePrinter implements ActionListener

      // an inner class

   {

     Date now = new Date();
      System.out.println("At the tone, the time is " + now);
      if (beep) Toolkit.getDefaultToolkit().beep();

   }

}

內部類既可以訪問自身的數據域,也可以訪問創建它的外圍類對象的數據域。內部類有一個隱式引用,其指向外圍類對象。


public void actionPerformed(ActionEvent event)

   Date now = new Date();

   System.out.println("At the tone, the time is " + now);

   if (outer.beep) Toolkit.getDefaultToolkit().beep();

}

內部類的默認構造函數

public TimePrinter(TalkingClock clock) // automatically generated code
{
     outer = clock;
}

局部內部類,不能用privatepublic聲明,start方法都不能訪問它。

public void start()
{
   class TimePrinter implements ActionListener
   {
      public void actionPerformed(ActionEvent event)
      {
          Date now = new Date();
          System.out.println("At the tone, the time is " + now);
          if (beep) Toolkit.getDefaultToolkit().beep();
      }
   }
   ActionListener listener = new TimePrinter();
   Timer t = new Timer(1000, listener);
   t.start();
}

匿名內部類

public void start(int interval, final boolean beep)
{
   ActionListener listener = new
      ActionListener()
      {
         public void actionPerformed(ActionEvent event)
         {
             Date now = new Date();
             System.out.println("At the tone, the time is " + now);
             if (beep) Toolkit.getDefaultToolkit().beep();
         }
      };
   Timer t = new Timer(1000, listener);
   t.start();
}

匿名構造了不能有構造函數,而是把構造函數參數傳遞給超類構造函數,

new SuperType(construction parameters)
{
   inner class methods and data
}

內部類實現接口時,不能有任何參數

new InterfaceType() { methods and data }

靜態內部類

class ArrayAlg
{
   public static class Pair
   {
      . . .
   }
   . . .
}

靜態內部類對象除了沒有對生產它的外部類對象的引用特權外,與其他的內部類完全一樣。



eric_xu 2010-05-16 21:26 發表評論
]]>
Java基礎筆試題http://www.aygfsteel.com/xujun7/archive/2010/05/16/321102.htmleric_xueric_xuSun, 16 May 2010 09:47:00 GMThttp://www.aygfsteel.com/xujun7/archive/2010/05/16/321102.htmlhttp://www.aygfsteel.com/xujun7/comments/321102.htmlhttp://www.aygfsteel.com/xujun7/archive/2010/05/16/321102.html#Feedback1http://www.aygfsteel.com/xujun7/comments/commentRss/321102.htmlhttp://www.aygfsteel.com/xujun7/services/trackbacks/321102.html閱讀全文

eric_xu 2010-05-16 17:47 發表評論
]]>
Core Java學習筆記 異常http://www.aygfsteel.com/xujun7/archive/2010/05/16/321101.htmleric_xueric_xuSun, 16 May 2010 09:40:00 GMThttp://www.aygfsteel.com/xujun7/archive/2010/05/16/321101.htmlhttp://www.aygfsteel.com/xujun7/comments/321101.htmlhttp://www.aygfsteel.com/xujun7/archive/2010/05/16/321101.html#Feedback0http://www.aygfsteel.com/xujun7/comments/commentRss/321101.htmlhttp://www.aygfsteel.com/xujun7/services/trackbacks/321101.html所有的異常都是由Throwable類繼承而來的,分為ErrorExceptionError類層次結構描述了Java運行時系統的內部錯誤和資源耗盡錯誤。Exception分為RuntimeExceptionIOException。由程序錯誤導致的異常屬于RuntimeException


The rule "If it is a RuntimeException, it was your fault"

一個方法必須聲明所有可能拋出的已檢查異常,而未檢查異常要么不可控制(Error),要么就應該避免(RuntimeException)

如果超類方法沒有拋出異常,則子類方法也不能拋出任何異常。子類方法拋出的異常不能超過超類聲明的范圍。



eric_xu 2010-05-16 17:40 發表評論
]]>
XMLhttp://www.aygfsteel.com/xujun7/archive/2010/05/12/320739.htmleric_xueric_xuWed, 12 May 2010 12:03:00 GMThttp://www.aygfsteel.com/xujun7/archive/2010/05/12/320739.htmlhttp://www.aygfsteel.com/xujun7/comments/320739.htmlhttp://www.aygfsteel.com/xujun7/archive/2010/05/12/320739.html#Feedback0http://www.aygfsteel.com/xujun7/comments/commentRss/320739.htmlhttp://www.aygfsteel.com/xujun7/services/trackbacks/320739.htmlXML的優勢:自描述,格式擴展性強,允許嵌套

子元素和屬性的區別,屬性是隱式的,不出現在文檔中。

Xmlns名字空間

CDATA用于對正常文本的處理。

XML模式定義語言:DTDXML Schema

XML Schema事實上也是XML的一種應用,也就是說XML Schema的格式與XML的格式是完全相同的,而作為SGML DTD的一個子集,XML DTD具有著與XML格式完全不同的格式。這種區別會給XML Schema的使用帶來許多好處:

1.       由于XML Schema本身也是一種XML,所以許多的XML編輯工具、API 開發包、XML語法分析器可以直接的應用到XML Schema,而不需要修改。

2.       作為XML的一個應用,XML Schema理所當然的繼承了XML的自描述性和可擴展性,這使得XML Schema 更具有可讀性和靈活性。

3.       由于格式完全與XML一樣,XML Schema除了可以像XML一樣處理外,也可以同它所描述的XML文檔以同樣的方式存儲在一起,方便管理。

4.       XML SchemaXML格式的一致性,使得以XML為數據交換的應用系統之間,也可以方便的進行模式交換。

XML Schema則不同,它內置了三十七種數據類型,如longintshortdouble等常用的數據類型,XML Schema數據類型的真正靈活性來自于其對用戶自定義類型的支持。使用complexTypesequence構造復雜類型。

DTD:限制并歸類文檔中的信息,并不限制基本類型意義上的類型,只限制元素子元素很屬性的出現。是有關一個元素中可以出現何種模式的子元素的一系列規則。|表示或,+表示一個或多個,*表示零個或多個,?表示零個或一個。

DTD

1.         單個文本元素和屬性不能定義,不能定于為整數。

2.         只能指定一個無序的集合,很難指定每個標簽只出現一次

XML Schema可以用minOccursmaxOccurs指定某個子元素出現的最多和最少次數。

XML SchemaDTD的優勢:

1.         允許把元素中出現的文本限制為專門類型

2.         允許創建用戶自定義類型

3.         允許唯一性和外鍵約束

4.         與名字空間結合以允許文檔遵從不同模式

5.         允許使用繼承來擴展復雜類型

6.         允許使用專門類型來對類型進行限制,最大最小值

XML查詢轉換工具:XPathXQueryXSLT

XPath是基于路徑表達式的語言,FLWOR表達式

XQuery仿照SQL

XSLT(XSL Transformation)是由XSL(XML Stylesheet Language)擴展而來的

#PCDATA表示文本數據,empty表示沒有內容,any表示任意。

<?xml version="1.0"?>

  <!DOCTYPE note [

  <!ELEMENT note (to,from,heading,body)>

  <!ELEMENT to (#PCDATA)>

  <!ELEMENT from (#PCDATA)>

  <!ELEMENT heading (#PCDATA)>

  <!ELEMENT body (#PCDATA)>

  ]>



eric_xu 2010-05-12 20:03 發表評論
]]>
Core Java學習筆記 集合http://www.aygfsteel.com/xujun7/archive/2010/05/12/320720.htmleric_xueric_xuWed, 12 May 2010 09:03:00 GMThttp://www.aygfsteel.com/xujun7/archive/2010/05/12/320720.htmlhttp://www.aygfsteel.com/xujun7/comments/320720.htmlhttp://www.aygfsteel.com/xujun7/archive/2010/05/12/320720.html#Feedback0http://www.aygfsteel.com/xujun7/comments/commentRss/320720.htmlhttp://www.aygfsteel.com/xujun7/services/trackbacks/320720.htmlCollection是集合類的上級接口,繼承與他的接口主要有Set 和List.
Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜索、排序、線程安全化等操作。

Java類庫中用于集合類的基本接口是Collection接口。Collection接口擴展自Iterable接口,因此,可以在任何集合類中使用for each循環。

publicinterface Iterable<T> {

    Iterator<T> iterator();

}

publicinterface Collection<E> extends Iterable<E>

CollectionIterator是泛型接口,任何集合都可以使用其方法。Collection接口中的方法:

public static <E> boolean contains(Collection<E> c, Object obj)

   for (E element : c)

      if (element.equals(obj))

         return true;

   return false;

}

iterator方法返回一個實現了Iterator接口的對象。

publicinterface Iterator<E> {

    boolean hasNext();

    E next();

    void remove();

}

Java集合類庫將接口與實現分離,Queue

publicabstractclass AbstractCollection<E> implements Collection<E>

一個集合類可以從AbstractCollection類擴展

除了Map結尾的類,其他類都實現了Collection接口。

ArrayList動態數組

ArrayList的內部實現是基于內部數組Object[],所以從概念上講,它更像數組,但LinkedList的內部實現是基于一組連接的記錄,所以,它更像一個鏈表結構。

ArrayList的前面或中間插入數據時,必須將其后的所有數據相應的后移,這樣必然要花費較多時間,所以,當你的操作是在一列數據的后面添加數據而不是在前面或中間,并且需要隨機地訪問其中的元素時,使用ArrayList會提供比較好的性能;

而訪問鏈表中的某個元素時,就必須從鏈表的一端開始沿著連接方向一個一個元素地去查找,直到找到所需的元素為止,所以,當你的操作是在一列數據的前面或中間添加或刪除數據,并且按照順序訪問其中的元素時,就應該使用LinkedList了。

如果在編程中,兩種情形交替出現,這時,可以考慮使用List這樣的通用接口,而不用關心具體的實現,在具體的情形下,它的性能由具體的實現來保證。

Java中每個鏈表實際上是雙重鏈表。鏈表是有序的。List接口和實現了該接口的LinkedList類。

interface ListIterator<E> extends Iterator<E>

ListIterator中的add方法,添加元素在迭代器之前,remove方法刪除上一個被訪問的元素。Set方法取代使用nextprevious方法最后訪問的元素。

ArrayList封裝了一個動態重新分配的數組。

Vector類的所有方法都是同步的。可以用兩個線程安全地訪問Vector對象。代碼會在同步操作上浪費相當多的時間。ArrayList類的方法不是同步的。

hashCode()方法必須和equals方法相兼容。如果a.equals(b)ture,ab必有相同的散列碼。散列嗎是通過對象實例字段產生的整數。

TreeSet是一個有序集合,插入時可以是任意順序,輸出時為排序后的順序。紅黑樹。默認情況下,TreeSet假設你插入的元素實現了Comparable接口。

publicinterface Comparable<T> {

    publicint compareTo(T o);

}

PriorityQueue是一種能夠在以任意順序插入元素后,再按排序順序讀取這些元素的數據結構。優先級隊列和TreeSet一樣,其所持有的元素可以是實現了Comparable接口的類的對象,也可以是在構造器中提供的Comparator對象。

HashMapTreeMap都實現了Map接口,映射表用于存放鍵/值對。

HashSet類,實現了基于散列表的散列集。不存在重復元素的集合。

散列映射表用于對鍵進行散列,樹狀映射表對于鍵的全局順序進行排序,并組成搜索樹。



 

框架就是一個類集合,它形成了創建高級功能的基礎。框架包含許多超類,這些超類擁有非常有用的功能、策略和機制。框架用戶建立的子類可以擴展類的功能,而不是重新創建基本的機制。

兩個用于集合的基本接口,CollectionMap

Set接口和Collection接口,Set不允許有重復元素。List接口提供隨機訪問的方法,ArrayListLiknkedList的訪問算法效率是不同的。




eric_xu 2010-05-12 17:03 發表評論
]]>
Eclipse插件開發學習筆記 圖像管理http://www.aygfsteel.com/xujun7/archive/2009/07/31/289256.htmleric_xueric_xuFri, 31 Jul 2009 05:51:00 GMThttp://www.aygfsteel.com/xujun7/archive/2009/07/31/289256.htmlhttp://www.aygfsteel.com/xujun7/comments/289256.htmlhttp://www.aygfsteel.com/xujun7/archive/2009/07/31/289256.html#Feedback1http://www.aygfsteel.com/xujun7/comments/commentRss/289256.htmlhttp://www.aygfsteel.com/xujun7/services/trackbacks/289256.html

Image對象是一個包裝了本地資源的Java結構,不能被Java的垃圾回收器管理。加載圖像而不卸載,會導致內存泄漏。

Eclipse使用ImageDescriptor來描述ImageImageDescriptor可以通過getImageDescriptor()方法來獲得。

ImageCache類為一個專門管理圖像的類。
package com.plugindev.addressbook.util;

import java.util.HashMap;
import java.util.Iterator;

import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.graphics.Image;

public class ImageCache {
    
private final static HashMap<ImageDescriptor, Image> imageMap = new HashMap<ImageDescriptor, Image>();

    
private static ImageCache instance;

    
//單例,獲得ImageCache的唯一實例
    public static ImageCache getInstance() {
        
if (instance == null)
            instance 
= new ImageCache();
        
return instance;
    }

    
//保證每個圖像資源只有唯一的創建操作
    public Image getImage(ImageDescriptor descriptor) {
        
if (descriptor == null)
            
return null;
        Image image 
= (Image) imageMap.get(descriptor);
        
if (image == null) {
            image 
= descriptor.createImage();
            imageMap.put(descriptor, image);
        }
        
return image;
    }

    
//卸載圖像資源
    public void dispose() {
        Iterator iter 
= imageMap.values().iterator();
        
while (iter.hasNext())
            ((Image) iter.next()).dispose();
        imageMap.clear();
    }
}

ImageKey保存所有圖像路徑字符串描述符
package com.plugindev.addressbook.util;

import org.eclipse.jface.resource.ImageDescriptor;

import com.plugindev.addressbook.Activator;

public final class ImageKeys {
    
public static final String IMAGE_CATEGORY = "icons/category.gif";
    
public static final String IMAGE_PEOPLE = "icons/people.gif";
    
    
//類別圖像
    public static final String IMG_CAT_BUSINESS = "icons/category/business.gif";
    
public static final String IMG_CAT_FAMILY = "icons/category/family.gif";
    
public static final String IMG_CAT_FRIENDS = "icons/category/friends.gif";
    
public static final String IMG_CAT_LOVER = "icons/category/lover.gif";
    
public static final String IMG_CAT_MATE = "icons/category/mate.gif";
    
public static final String IMG_CAT_ORDINARY = "icons/category/ordinary.gif";
    
public static final String IMG_CAT_VIP = "icons/category/vip.gif";
    
public static final String IMG_CAT_UNKNOWN = "icons/category/unknown.gif";
    
public static final String IMG_CAT_TEACHER = "icons/category/teacher.gif";
    
    
//操作圖像
    public static final String IMG_TOOL_ADD = "icons/actions/add.gif";
    
public static final String IMG_TOOL_DELETE = "icons/actions/delete.gif";
    
public static final String IMG_TOOL_DISABLEDELETE = "icons/actions/delete_dis.gif";
    
public static final String IMG_TOOL_FILTER = "icons/actions/filter.gif";
    
    
//編輯器相關
    public static final String IMG_FORM_BG = "icons/editors/form_banner.gif"//$NON-NLS-1$
    public static final String IMG_HORIZONTAL = "icons/editors/th_horizontal.gif"//$NON-NLS-1$
    public static final String IMG_VERTICAL = "icons/editors/th_vertical.gif"//$NON-NLS-1$
    
    
//ScrollBlock圖標
    public static final String IMG_SCROL_BASIC = "icons/editors/basic.gif";
    
public static final String IMG_SCROL_PHONE = "icons/editors/phone.gif";
    
public static final String IMG_SCROL_AREA = "icons/editors/area.gif";
    
public static final String IMG_SCROL_CONTACT = "icons/editors/contact.gif";
    
    
//向導相關
    public static final String IMG_WIZARD_NEW = "icons/wizards/new_wiz.gif";
    
    
//幫助相關
    public static final String IMG_HELP = "icons/help/help.gif";
    
    
public static ImageDescriptor getImageDescriptor(String path)
    {
        
return Activator.getImageDescriptor(path);
    }
}




eric_xu 2009-07-31 13:51 發表評論
]]>
Eclipse插件開發學習筆記 Viewshttp://www.aygfsteel.com/xujun7/archive/2009/07/31/289254.htmleric_xueric_xuFri, 31 Jul 2009 05:42:00 GMThttp://www.aygfsteel.com/xujun7/archive/2009/07/31/289254.htmlhttp://www.aygfsteel.com/xujun7/comments/289254.htmlhttp://www.aygfsteel.com/xujun7/archive/2009/07/31/289254.html#Feedback0http://www.aygfsteel.com/xujun7/comments/commentRss/289254.htmlhttp://www.aygfsteel.com/xujun7/services/trackbacks/289254.html

創建編輯器的上下文操作,targetID="#TextEditorContext",為eclipse默認文件編輯器的上下文菜單標識符。實現類必須實現IEditorActionDelegate接口。

Java編輯器對應的ID為:#TextEditorContext #CompilationUnitEditorContext,定義好targetID,就把我們的插件id指向視圖菜單的id了。這樣Java編輯器就會添加我們的菜單項了。

targetID用來與特定的編輯器,查看器,菜單綁定。

命令與鍵綁定,和操作相關聯。命令只是操作的聲明,操作的具體實現細節由操作本身來完成。將命令從操作實現中分離出來。

Org.eclipse.ui.commands擴展點 定義命令

Org.eclipse.ui.bindings擴展點 與命令和鍵綁定

 

視圖的實現類都必須實現org.eclipse.ui.IViewPart接口,一般都會集成org.eclipse.ui.ViewPart類。

視圖的行為由一個實現了org.eclipse.ui.IViewPart接口的類定義

 

IStructuredContentProvider結構化內容提供者負責從輸入對象中提取對象,把它傳遞給表格查看器進行顯示。AddressViewContentProvider實現IStructuredContentProvider(內容與查看器的綁定)和 AddressManagerListener接口(監聽模型變化)。

AddressViewContentProvider通過AddressManager獲取模型來提供顯示

AddressViewContentProvider實現AddressManagerListeneraddressesChanged方法。

LableProvider標簽提供者將獲取內容提供者返回的一個表格行對象,并提取要顯示到的列上的值。

ITableLabelProvider接口要求實現getColumnTextgetColumnImage兩個主要的方法,getColumnText返回指定單元格的顯示文本,getColumnImage返回指定單元格的顯示圖標。

根據對表格列的判斷來顯示相應區域的文本和圖像。

public String getColumnText(Object element, int columnIndex),其中element表示單元格所在行的對象,columnIndex表示單元格所在的列,返回顯示的文本。

public Image getColumnImage(Object element, int columnIndex),其中element表示單元格所在行的對象,columnIndex表示單元格所在的列,返回此單元格的顯示圖標。

ViewerSorter查看器排序器用于對內容提供者提供的元素進行排序,繼承ViewerSorter類。

一個視圖僅可以有一個內容提供者,一個標簽提供者和一個排序器,但過濾器可以有很多個。

ViewerFilter類用于確定顯示內容提供者返回的哪些行對象,不顯示哪些行對象。

 

獲取當前選中項,先查找視圖,找到該視圖后,調用getSelection()得到當前選擇項,然后馬上轉換為IStructuredSelection,以后的操作就是統一的了,因為有IStructuredSelection接口。如果是在action中遇到這種需求,就將event調用getSelection(),然后轉換為IStructuredSelection,后續操作相同。

 

Eclipse的每個視圖(View)都有自己的菜單和工具條,View通過與自己相關的IViewSite對象與這些東西打交道,確切的說,是通過這個IViewSite對象的IActionBars對象來管理,ActionBars對象負責菜單、工具條和狀態欄。

makeActions是創建操作,必要的IAction對象,這些對象可用在菜單、工具條里。

hookContextMenu是把剛剛創建的IAction對象放進與View相關的MenuManager里。

當觸發了menu事件時,重新填充(fillContextMenu

setRemoveAllWhenShown(true)的作用是清空以前顯示的菜單項。不把removeAllWhenShow置為true的話,每點一下右鍵你就會看到菜單項多出一倍來。

MenuManager可以創建出一個Menu對象,然后我們用表格的setMenu方法將表格控件與Menu控件聯系在一起就好了。

getSite().registerContextMenu(menuMgr, viewer)這是context menu能不能顯示的關鍵。一個視圖中可以有多個context menu,而每一個context menu都必須注冊給workbench。這需要通過調用org.eclipse.ui.IWorkbenchPartSite.registerContextMenu(MenuManager menuManager, ISelectionProvider selectionProvider)或者(當有多個注冊的context menu時)org.eclipse.ui.IWorkbenchPartSite.registerContextMenu(String menuId, MenuManager menuManager, ISelectionProvider selectionProvider) 增加的參數menuId用于區分不同的context menu

上下文菜單比工具欄多一步創建上下文菜單。

 

屬性視圖支持所有實現IResource接口的資源。

一個視圖(View)希望得到另外一個視圖顯示的內容,或者選擇的內容。在Eclipse中,比較標準的做法是通過ISelectionProviderISelectionListener來完成的。

Eclipse為了解決這個問題,提供了所謂的Site,以及ISelectionService機制,來處理視圖之間的簡單的交互。簡單的說,ViewSite提供了一個交互的中心點,其它ViewViewSite提供選擇事件,或者向其注冊監聽器,而事件的觸發與轉發則由ViewSite()來完成。只需在View中實現ISelectionListener接口,就可以監聽其他Workbench部分發生的選擇事件。

Workbench注冊監聽器

getSite().getPage().addSelectionListener(this);

向特定WorkbenchID注冊監聽器

getSite().getPage().addSelectionListener(String WorkbenchID, ISelectionListener);

并實現selectionChanged方法來處理監聽器捕獲到的事件。

 

一個ISelectionProvider如果希望被別的View進行監聽的話,則應該向其Site()進行注冊。

getViewSite().setSelectionProvider(viewer);

IPropertySource的實現類必須為每個顯示在屬性視圖中的項創建一個屬性描述符。

ComboBoxPropertyDescriptor可以在屬性視圖的單元格中顯示復選框,但必須為其定義標簽提供者和一組String數組為顯示內容。getText的參數是getPropertyValue的返回值,這個返回值必須是整數。在ComboBoxPropertyDescriptor中,每個項是按照它們的索引號來區分的。在initProperties中,將類別名用整數表示。

Integer item = (Integer)element;

 

表格查看器添加狀態欄支持,則表格查看器添加監聽器ISelectionChangedListener



eric_xu 2009-07-31 13:42 發表評論
]]>
Eclipse插件體系結構http://www.aygfsteel.com/xujun7/archive/2009/07/28/288759.htmleric_xueric_xuTue, 28 Jul 2009 08:07:00 GMThttp://www.aygfsteel.com/xujun7/archive/2009/07/28/288759.htmlhttp://www.aygfsteel.com/xujun7/comments/288759.htmlhttp://www.aygfsteel.com/xujun7/archive/2009/07/28/288759.html#Feedback0http://www.aygfsteel.com/xujun7/comments/commentRss/288759.htmlhttp://www.aygfsteel.com/xujun7/services/trackbacks/288759.html

插件是為系統提供功能的代碼和/或數據的結構化包。可以以代碼庫(帶有公共 [應用程序接口] API Java 類)、平臺擴展甚至文檔的形式來提供功能。插件可以定義擴展點、定義良好的位置,其他插件可以在這些位置添加功能。

Eclipse使用OSGi作為插件系統的基礎。動態添加新插件和停止現有插件的能力。以動態方式管理組件生命周期的一個健壯的系統。

OSGi是基于Java的框架,旨在用于需要長運行時間、動態更新和對運行環境破壞最小的系統。

OSGi規范定義了綁定包生命周期的基礎架構和綁定包的交互方式。這些規則通過使用特殊 Java類加載器來強制執行。

在一般Java應用程序中,CLASSPATH中的所有類都對所有其他類可見。相反,OSGi類加載器基于OSGi規范和每個綁定包的manifest.mf文件中指定的選項來限制類交互。

3.1之前版本的Eclipse中,在每個插件的plugin.xml文件中定義插件依賴關系以及擴展和擴展點。在使用OSGi的新版本Eclipse中,依賴關系信息被分解到manifest.mf文件中,而 plugin.xml文件只包含擴展和擴展點的XML定義。

插件級的依賴關系改為需要顯式導出和導入包的依賴關系。插件開發人員必須進行專門選擇來使插件中的功能可供外部使用。該限制允許內部包保留在內部,避免插件暴露不必要的類。

Eclipse的擴展和擴展點 可插拔

每一個希望被別的模塊擴展的模塊,都必須聲明一系列的擴展點,即插座;希望在這個模塊上擴展功能的模塊,需要按照擴展點的什么來編寫擴展,即插頭。擴展點提供服務,擴展是要服務。

延遲裝載,只有在一個插件被其他模塊調用的時候,才裝載到內存中。

通過將擴展的聲明和實現分離,eclipse實現類延遲裝載。

擴展點和擴展的聲明都是通過XML文件完成的,即清單文件MANIFEST.MF,描述了一個插件能夠做什么,而JAVA代碼則具體完成這些功能。系統啟動時,只需搜索清單文件,建立一張索引表,知道有哪些插件以及能夠提供什么服務。當eclipse第一次啟動時,eclipse運行時會遍歷plugins文件夾中的目錄,掃描每個插件的清單文件信息,并建立一個內部模型來記錄它所找到的每個插件的信息。

RCP包括基于OSGi的運行時框架Equniox,基于SWT/JFace的圖形模塊,eclipse平臺的UIRuntime模塊。基于Eclipse的應用程序所需的最小插件集稱為Eclipse Rich Client PlatformRCP


Platform Runtime 平臺運行庫是內核,它在啟動時檢查已安裝了哪些插件,并創建關于它們的注冊表信息。即在eclipse運行時發現和管理插件。為降低啟動時間和資源使用,它在實際需要任何插件時才加載該插件。除了內核外,其他每樣東西都是作為插件來實現的。

Workspace 工作區是負責管理用戶資源的插件。這包括用戶創建的項目、那些項目中的文件,以及文件變更和其他資源。工作區還負責通知其他插件關于資源變更的信息,比如文件創建、刪除或更改。

Workbench 工作臺為Eclipse提供用戶界面。它是使用標準窗口工具包(SWT)和一個更高級的 APIJFace)來構建的;SWT Java Swing/AWT GUI API 的非標準替代者,JFace 則建立在 SWT 基礎上,提供用戶界面組件。

插件可以扮演雙重角色,其他插件服務的使用者和其他插件服務的提供者。

 

manifest.mf

Bundle-Activator

該類用于啟動和停止綁定包。該類擴展 org.eclipse.core.runtime.Plugin,實現了 BundleActivator 接口。

Bundle-Version

該屬性指定綁定包的版本號。包導入和必需的綁定包規范可以包括綁定包版本號。

Export-Package

該屬性指定要公共暴露給其他插件的所有包。

Import-Package

該屬性指定要從必需插件中顯式導入的所有包。默認情況下,必須為要啟動的綁定包解析所有包。還可以將包導入指定為可選項,以支持包不存在的情況。顯式導入的類在 Require-Bundle 插件中的包之前解析。

Require-Bundle

該屬性指定要在給定綁定包中導入使用的綁定包及其已導出的包。指定的綁定包在顯式包導入之后解析。

 

 

----------------------            --------------------
|plugin A            |            |plugin B          |
|   ---------------  | contibute  |  --------------  |
|   | ext point p | <--------------- | extension  |  |
|   ---------------  |_           |  --------------  |
|         ||         | |          |        ||        |
|   ---------------  | |implement |  --------------  |
|   | interface I | <--|------------ | class  C   |  |
|   ---------------  | |          |  --------------  |
---------------------- |          ----------/ -------
                       |  create, call       |
                       ----------------------|

你可以把extension point想為接口而我們擴展這些extension,其實就是實現了這個接口

假設plugin A定義了一個extension point,  plugin B定義了一個extension,是基于plugin A的這個extension point,它的實現類是class C,eclipse啟動后會讀取每個plugin的配置plugin.xml,然后發現plugin B有一個基于ext point p的擴展,那它就會用interface I作為對象然后實例化一個class C, 就等于實現了這個extension

 

eclipse的內部實現
IPluginRegistry registry = Platform.getPluginRegistry();
IExtensionPoint extensionPoint = registry.getExtensionPoint(xpid); //
通過擴展點ID獲得擴展點
IExtension[] extensions = extensionPoint.getExtensions(); //
獲得該擴展點的所有擴展
// For each extension ...
for (int i = 0; i < extensions.length; i++) {
    IExtension extension = extensions[i];
    IConfigurationElement[] elements = extension.getConfigurationElements(); //
獲得擴展點配置元素
    configurationElement[j].createExecutableExtension(“Class”); //
為每個回調對象創建實例

    ……
}
eclipse
就是注冊每一個extensionextension point,然后用extension point來實例化它對應的那個extension

發生事件并向其它對象請求處理的對象被稱為事件對象,而處理事件的對象被稱為回調對象。回調對象由擴展者插件定義,由宿主插件創建實例。

Eclipsebundle使用各自的class loader,若需要引用其他bundle類來動態創建實例,則需要使用類所在的bundleclass loader

eric_xu 2009-07-28 16:07 發表評論
]]>
主站蜘蛛池模板: 烟台市| 罗山县| 阳曲县| 习水县| 金塔县| 加查县| 五原县| 永仁县| 鸡西市| 神农架林区| 黄石市| 永川市| 永顺县| 隆子县| 南木林县| 清水县| 新竹县| 弥渡县| 潮安县| 横峰县| 杭锦旗| 洛隆县| 隆回县| 七台河市| 津南区| 普格县| 方正县| 廉江市| 涿州市| 海南省| 东乡族自治县| 炉霍县| 循化| 雷州市| 积石山| 双鸭山市| 长汀县| 大理市| 永昌县| 图木舒克市| 饶河县|