2011-12-02 29 views
5

पर बिना शर्त रनटाइम निर्भरता उत्पन्न करता है मेरे पास एक मुश्किल जावा लाइब्रेरी कार्य जैसा लगता है।एक कक्षा वर्ग को सशर्त रूप से संभालने के लिए जावा लाइब्रेरी लिखना w/o उस कक्षा

मुझे JTable एस के साथ काम करने के लिए एडाप्टर/सहायक वर्ग लिखने की आवश्यकता है जिसमें JTableJXTable है, तो कुछ अतिरिक्त कार्यक्षमता है। लेकिन मैं swingx कोर-1.6.2.jar पर एक क्रम निर्भरता को जोड़ने के लिए नहीं करना चाहती जब तक अपने आवेदन वास्तव में JXTable का उपयोग करता

कैसे (इस स्थिति में यह पहले से ही classpath पर SwingX जार फ़ाइल होने की आवश्यकता है) क्या मैं इसे पूरा करने के लिए अपना कोड डीकूल कर सकता हूं? मैं यह भी नहीं जानता कि मैं JXTable के लिए कैसे परीक्षण कर सकता हूं; यदि मैं परीक्षण के रूप में instanceof JXTable का उपयोग करने का प्रयास करता हूं, तो इसका अर्थ है कि मेरे कोड में पहले से ही बिना शर्त शर्त रनटाइम पर JXTable है।

मैंने पहले कि है "वैकल्पिक" क्रम लिंकेज निर्भरता जावा लाइब्रेरीज में लिखा है: अगर मैं अपने पुस्तकालय में इस है:

package com.foobar.foolib; 

// import from whizbang.jar 
import com.whizbang.BloatwareThingy; 

public class SuperObject 
{ 
    /* ... uses a BloatwareThingy ... */ 
} 

और SuperObject, तो जब तक केवल वर्ग whizbang.jar का उपयोग करता है मेरा एंड एप्लिकेशन SuperObject का उपयोग नहीं करता है, तो whizbang.jar पर कोई रनटाइम निर्भरता नहीं है; यदि मेरा अंतिम एप्लिकेशन SuperObject का उपयोग करना चाहता है, तो उसे क्लासपाथ पर whizbang.jar शामिल करने की आवश्यकता है। आवेदन के दृष्टिकोण से वैकल्पिक। बहुत अच्छा काम करता है।

किसी दिए गए जेटीबल को JXTable का उदाहरण होने के लिए परीक्षण करने के लिए एक तरीका कैसे लिख सकता है, स्विंगएक्स जार फ़ाइल पर निर्भरता की आवश्यकता के बिना यदि एप्लिकेशन केवल जेटीबल का उपयोग करता है?

उत्तर

2

इसके लिए प्रतिबिंब की आवश्यकता है। JXTable क्लास के लिए क्लास ऑब्जेक्ट लाने के लिए Class.forName(...) का उपयोग करें। यदि यह मौजूद नहीं है, तो यह ClassNotFoundException फेंक देगा।

अगर यह मौजूद है, तो आप उस कक्षा वस्तु का उपयोग तरीकों की जरूरत लाने और फिर उन्हें JTable वस्तु को लागू करने के लिए कर सकते हैं।

0

सबसे पहले, यह एक संकलन समय निर्भरता आप समाप्त करने के लिए, रनटाइम नहीं की कोशिश कर रहे है।

आप के माध्यम से

if (table.getClass().getName().equals("path.to.JXTable") 
{ 
// Do something using reflection. 
} 
else // proceed as normal 
+0

यह संकलन समय नहीं है निर्भरता मैं खत्म करने की कोशिश कर रहा हूँ; मैं अपनी लाइब्रेरी के लिए स्विंगएक्स पर एक संकलन-समय निर्भरता रखने का इरादा रखता हूं। मैं सिर्फ स्विंगएक्स पर * रनटाइम * निर्भरता नहीं चाहता जब तक कि मेरा एप्लिकेशन भी न हो। कुछ उपयोगी विचारों के लिए –

5

वर्ग के प्रकार जांच कर सकते हैं के साथ परीक्षण कर सकते हैं:

Class cls = null; 
try { 
    cls = Class.forName("org.jdesktop.swingx.JXTable"); 
} catch(Throwable ex) {} 

if(cls != null) 
    // have JXTable 

उसके बाद आप सभी वर्गों, तरीकों, कंस्ट्रक्टर को पहुँचता लिए विशेष रूप से प्रतिबिंब का उपयोग करना होगा और उस बाहरी पुस्तकालय से खेतों।

public interface MyTableHandler 
{ 
    void doSomethingWithTable(JTable table); 
} 

public class JXTableHandler implements MyTableHandler 
{ 
    void doSomethingWithTable(JTable table) 
    { 
     JXTable jxt = (JXTable) table; 
     // use JXTable API directly ... 
    } 
} 

public class StdTableHandler implements MyTableHandler 
{ 
    void doSomethingWithTable(JTable table) 
    { 
     // do without JXTable 
    } 
} 

public class MyIndependentClass 
{ 
    static final MyTableHandler handler; 

    static { 
     try { 
      Class.forName("org.jdesktop.swingx.JXTable"); // force exception 
      handler = (MyTableHandler) Class.forName("my.pkg.JXTableHelper") 
              .newInstance(); 
     } catch(Throwable ex) { 
      handler = new StdTableHandler(); 
     } 
    } 
    public void treatTable(JTable table) 
    { 
     handler.doSomethingWithTable(table); 
    } 
} 

: यदि आप इस तरह से आप सहायक वर्गों कि JXTable सीधे उपयोग कर सकते हैं लिख सकता है लेकिन प्रतिबिंब के माध्यम से बनाया है और इंटरफेस या सार वर्गों के माध्यम से लागू करने के एक बड़े API एक्सेस करने की जरूरत है

इस रूप में बहुत अनाड़ी बन सकता है जावा वी एम कक्षाएं कि खुद के लिए इस्तेमाल नहीं कर रहे हैं लेकिन जार फ़ाइलों में ही मौजूद हैं nonexisting एपीआई के उपयोग के साथ कोई समस्या नहीं है। इस दृष्टिकोण के साथ आप JXTableHandler का प्रयोग करेंगे ही अगर org.jdesktop.swingx.JXTable अन्यथा उपलब्ध और StdTableHandler है।एक बार का उपयोग कर

JComponent c = ... 

    if (c instanceof JTable) 
    { 
     JTable table = (JTable) c; 
     boolean isJXTable = new JXTableHandler().handleTable(table); 
     System.out.println("jtable "+ 
      (isJXTable ? "is" : "is not")+" a jxtable"); 
    } 

मैं इसके साथ एक आवेदन भाग गया: मेरी लाइब्रेरी में

सहायक वर्ग: मेरी लाइब्रेरी में कहीं

static private class JXTableHandler 
{ 
    public JXTableHandler() {} 

    boolean testJXTable(JTable table) 
    { 
     try 
     { 
      if (table instanceof JXTable) 
       return true; 
     } 
     catch (java.lang.NoClassDefFoundError e) { /*gulp*/ } 
     return false; 
    } 
    boolean handleTable(JTable table) 
    { 
     if (!testJXTable(table)) 
      return false; 

     JXTable xtable = (JXTable) table; 
     // here's where we do stuff, this is just something basic 
     System.out.println("columnControlVisible: " 
      +xtable.isColumnControlVisible()); 
     return true; 
    } 
} 

प्रयोग

+0

+1। –

0

अहा, मैं काम करने के लिए कुछ है केवल जेटीबल्स, मेरे क्लासपाथ पर स्विंगक्स के बिना, और यह काम करता है, क्योंकि यह NoClassDefFoundError को पकड़ता है, और उस स्थिति में यह कभी भी JXTable क्लास तक पहुंचने का प्रयास नहीं करता है। अगर मैं अपने क्लासपाथ पर स्विंगक्स के साथ अपने आवेदन में जेक्स्टेबल का उपयोग करता हूं, तो यह भी काम करता है। (और यह भी "काम करता है" अगर मैं अपने क्लासपाथ पर स्विंगक्स के बिना अपने आवेदन में जेक्स्टेबल का उपयोग करता हूं, क्योंकि एप्लिकेशन एक जेक्स्टेबल को तत्काल नहीं कर सकता है, जिसकी उम्मीद है कि मेरी लाइब्रेरी नहीं बदली है।)

+0

इस ऐप्राच में JXTableHandler को 'new JXTableHandler()। HandleTable (table) में NoClassDefFoundErrors के बिना लोड करने की गारंटी नहीं है; '। इसे तब तक काम करना चाहिए जब तक इसमें चर या आंतरिक कक्षाएं न हों जो मौजूदा बाहरी वर्गों पर निर्भर करती हैं। लेकिन अगर मैं आवश्यक एपीआई यह सुनिश्चित करने के लिए उपलब्ध नहीं हूं कि इस तरह के एक सहायक वर्ग को लोड करने से बचाना पसंद है, तो कक्षा विकसित होने पर मुझे अचानक अपवाद नहीं मिलते हैं। – x4u