2015-02-04 7 views
8

कहना चलें, हम निम्नलिखित वर्ग है:जावाएफएक्स 8 जावाफ़ैक्स एप्लिकेशन थ्रेड को लगभग खाली एप्लिकेशन क्लास में कैसे शुरू करता है?

import javafx.application.Application; 
import javafx.stage.Stage; 

public class Test extends Application 
{ 
    public Test() 
    { 
     System.out.println("Constructor"); 
    } 

    @Override 
    public void start(Stage primaryStage) throws Exception 
    { 
     System.out.println("start"); 
    } 

    public static void main(String... args) 
    { 
     System.out.println("main"); 
    } 
} 

यह Application से ली गई है, लेकिन वह अपने किसी भी विधि का उपयोग नहीं करता। आमतौर पर आप मुख्य में launch(args) पर कॉल करके जावाएफएक्स एप्लिकेशन शुरू करते हैं।

जब मैं इस प्रोग्राम को शुरू करता हूं तो एकमात्र आउटपुट "मुख्य" होता है, इसलिए कन्स्ट्रक्टर और स्टार्ट नहीं कहा जाता है, लेकिन प्रोग्राम समाप्त नहीं होता है क्योंकि जावाएफएक्स एप्लीकेशन थ्रेड चल रहा है। लेकिन यह कहां से आता है?

मैंने कुछ डीबगिंग किया और पाया कि मुख्य विधि चलने से पहले थ्रेड मुख्य धागे से शुरू होता है। स्टैक ट्रेस NativeMethodAccessorImpl के साथ शुरू होता है।

भी weirder प्राप्त करने के लिए: जब मैं एक अलग वर्ग से मुख्य विधि शुरू, JavaFX आवेदन धागा शुरू नहीं किया गया है:

public class Test2 
{ 
    public static void main(String[] args) 
    { 
     Test.main(args); 
    } 
} 

तो काला जादू की किस तरह यह है?

+0

काले जादू के लिए उपरोक्त। – GGrec

+0

दूसरी कक्षा में, टेस्ट 2, आपने अपनी मूल कक्षा घोषणा में एक विस्तारित आवेदन नहीं जोड़ा है। तो आपके रनटाइम में कोई इंकलिंग नहीं है कि जावाएफएक्स प्रक्रिया शामिल है - यह किसी अन्य प्रकार की जावा क्लास की मुख्य (।) विधि हो सकती है। – Trunk

उत्तर

5

जावा दो अनुप्रयोगों को लॉन्च करने के लिए विभिन्न दृष्टिकोणों का उपयोग करता है।

निम्नलिखित कोड चलाने की कोशिश करें:

public class Test3 { 

    public static void main(String[] args) { 

     Class<?> actualMainClassTest = LauncherHelper.checkAndLoadMain(true, 1, Test.class.getName()); 
     Class<?> actualMainClassTest2 = LauncherHelper.checkAndLoadMain(true, 1, Test2.class.getName()); 

     System.out.println("Actual loaded main class for Test: " + actualMainClassTest.getName()); 
     System.out.println("Actual loaded main class for Test2: " + actualMainClassTest2.getName()); 
    } 
} 

उत्पादन होता है

    टेस्ट के लिए
  • वास्तविक लोड मुख्य वर्ग: sun.launcher.LauncherHelper $ FXHelper
  • Test2 के लिए वास्तविक लोड मुख्य वर्ग: टेस्ट 2

आप देख सकते हैं कि 0 के लिए वास्तविक लोड की गई मुख्य कक्षावर्ग Test2 है, लेकिन Test के लिए लोड की गई मुख्य कक्षा sun.launcher.LauncherHelper$FXHelper है।

ऐसा इसलिए होता है क्योंकि जावा लॉन्चर जांचता है कि मुख्य श्रेणी लॉन्च होने पर javafx.application.Application का उप-वर्ग है। यदि ऐसा है, तो यह sun.launcher.LauncherHelper$FXHelper की मुख्य विधि को लोड करता है, जो JavaFX अनुप्रयोगों (com.sun.javafx.application.LauncherImpl#launchApplication) के लिए लॉन्चर विधि को आमंत्रित करता है।

यह विधि JavaFX एप्लिकेशन लॉन्च करने के लिए ज़िम्मेदार है। के बाद आवेदन शुरू की है Test#main कहा जाता है:

enter image description here

Test#main Test2 से बुलाया जाता है, विदेशी मुद्रा लांचर इस्तेमाल नहीं किया है क्योंकि Test2 javafx.application.Application का एक उपवर्ग नहीं है।

+0

तो, यह java.exe का व्यवहार है और केवल javafx.application के लिए काम करता है। आवेदन? – Rafaesp

संबंधित मुद्दे