2010-09-26 12 views
1

我想圍繞小應用程序的使用規則進行包裝。我意識到一個applet不必有一個主要方法(它可以使用init()代替),但是我的教授提供的每個代碼示例都是一個帶有main方法的applet,如下面的代碼所示。是否適合在applet中使用主要方法?

我的理解是,由於安全問題,在applet中使用主要方法並不是一個好主意,這是正確的嗎?何時(如果曾經)我應該在applet中使用main方法?

此外,我的教授正在使用這樣的applet嵌入到PowerPoint演示文稿中,然後他可以在他的演示文稿中輕鬆運行。如果小程序使用inti()而不是main(),是否仍然可以運行嵌入到PowerPoint演示文稿中的小應用程序?我問這是因爲我看不到爲什麼他會在這樣一個applet中使用main方法的任何原因,除非applet在嵌入到PowerPoint演示文稿中時才能正常運行。

//EventDispatcherThreadDemo.java 

import javax.swing.*; 

public class EventDispatcherThreadDemo extends Japplet{ 

    public EventDispatcherThreadDemo(){ 
     add(new JLabel("Hi, it runs from an event dispatch thread")); 
    } 

    public static void main(Stirng[] args){ 

     SwingUtilities.invokeLater(new Runnable(){ 

      public void run(){ 
       JFrame frame = new JFrame("EventDispatcherThreadDemo"); 
       frame.add(new EventDispatcherThreadDemo()); 
       frame.setSize(200, 200); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 

     }); 

    } 

} 

P.S.這與作業無關,只是想了解更多關於小程序的知識。

回答

4

main方法對applet沒有任何特殊含義。

你的教授正在將它與幾行代碼一起放入JFrame中,以便能夠通過簡單的「java foobar」命令從命令行運行它。這與運行「appletviewer foobar」命令相反,該命令可能與從PowerPoint等其他程序啓動時遇到問題。儘管它沒有給出完整的Applet環境,但演示程序可能非常簡單,沒關係。

他爲什麼選擇這樣做,而不是僅僅向你展示一個帶有applet的大型HTML頁面,我不知道。

+1

這樣做的一個原因是,在調試器中運行純Java程序通常比嘗試一個小程序更容易 – Mark 2010-09-27 00:22:50

+0

我剛剛沒有將小程序弄亂,我恐怕很快就不得不做出一個。做一個普通的Java應用程序我沒有問題,所以我想如果我能繼續使用我所知道的(使用主要方法),我應該沒問題。看起來我可以在普通應用程序和BOOM中「擴展Applet」或「擴展JApplet」,我有一個小程序。是非常正確的? – ubiquibacon 2010-09-27 05:35:22

+0

不是。請參閱官方Java教程的Applet部分 - http://download.oracle.com/javase/tutorial/deployment/applet/ – 2010-09-27 06:22:49

3

main()對applet沒有安全影響,因爲它不被applet容器調用。即使是這樣,小程序仍然只限於安全沙箱。

OTOH,開發混合applet /應用程序可以很有意義。傳統上基於幀的應用程序。比小應用程序更容易開發和調試。

如果您想向最終用戶提供這兩種表單,它也可以是有意義的。 ;)

看到這個example of a hybrid,可能有助於說明。

1

其實至少有一個安全問題。假設你的小程序:

  1. 簽訂
  2. 已經離開其main方法,做一些有潛在危險的像寫一個文件

調試代碼然後,攻擊者可以創建一個Java Web Start應用程序描述符點到您的.jar文件並以完全權限啓動您的main方法。

這個特定的攻擊可以通過在您的.jar文件中添加一個空的文件調用JNLP‑INF/APPLICATION.JNLP來防範。但可能還有其他可能的攻擊,所以我認爲你的教授是正確的避免它。

+1

嗯,是的,但問題在於,您已經簽署了一個包含危險代碼的jar文件那裏。 – Thilo 2010-09-27 02:27:55

+0

如果沒有危險代碼,簽名jar會有什麼意義? – 2010-09-27 08:54:49

+0

@Thilo,問題在於你期望你的applet的'init'方法被調用,你可能會在簽名jar之前對它進行審計。但是,如果您錯誤地認爲您的'main'方法在部署爲applet時無法訪問,那麼您可能忽略檢查它。 – finnw 2010-09-27 11:20:19

2

不幸的是很多示例代碼都採用不應該遵循的捷徑。這裏的危險是,學習者不能模仿什麼,不該做什麼。

小程序生命週期方法和main方法都是upcalls的例子。與聽衆一樣,他們應該簡短,提取必要的信息,封裝上調的處理並在對該對象有意義的對象上調用方法(特別是不要依賴於上調)。