2010-12-08 17 views
15

के साथ कक्षा से नया उदाहरण बनाना मेरे पास ऐसी स्थिति है जहां मेरी जावा क्लास को कुछ प्रकार की वस्तुओं का एक टन बनाने की आवश्यकता है। मैं पैरामीटर के रूप में बनाए गए ऑब्जेक्ट्स के वर्ग का नाम देना चाहता हूं। इसके अलावा, मुझे बनाए गए वर्ग को अपने कन्स्ट्रक्टर में पैरामीटर देना होगा। मेरे पासकन्स्ट्रक्टर पैरामीटर

class Compressor { 

    Class ccos; 

    public Compressor(Class ccos) { 
     this.ccos = ccos; 
    } 

    public int getCompressedSize(byte[] array) { 
     OutputStream os = new ByteArrayOutputStream(); 
     // the following doesn't work because ccos would need os as its constructor's parameter 
     OutputStream cos = (OutputStream) ccos.newInstance(); 
     // .. 
    } 
} 

क्या आपके पास कोई विचार है कि मैं इसका समाधान कैसे कर सकता हूं?

संपादित करें:

यह एक अनुसंधान परियोजना जहाँ हम कई अलग अलग आदानों के साथ कई अलग अलग कम्प्रेसर के प्रदर्शन का मूल्यांकन करने की जरूरत है का हिस्सा है। Class ccos या तो जावा की मानक लाइब्रेरी, अपाचे कंप्रेस कॉमन्स या lzma-java से संकुचित OutputStream है।

वर्तमान में मेरे पास निम्नलिखित कार्य हैं जो ठीक काम करने लगते हैं। अन्य विचारों का स्वागत है।

OutputStream os = new ByteArrayOutputStream(); 
OutputStream compressedOut = (OutputStream) ccos.getConstructor(OutputStream.class).newInstance(os); 
final InputStream sourceIn = new ByteArrayInputStream(array); 
+0

क्यों आपको बताने के लिए की आवश्यकता है 'Compressor' वस्तुओं की किस तरह बनाने के लिए? यहां किस तरह के वर्गों का उपयोग किया जाएगा? –

+1

क्या आपने इसे प्रतिबिंब के साथ हैक करने के बजाय इसके लिए एक अमूर्त कारखाने का उपयोग करने पर विचार किया है? –

+0

कुछ और जानकारी जोड़ने के लिए संपादित – lhahne

उत्तर

16

आप Class.getConstructor(paramsTypes...) विधि का उपयोग कर सकते हैं और निर्माता पर newInstance(..) पर कॉल कर सकते हैं। आपके मामले में:

Compressor.class.getConstructor(Class.class).newInstance(Some.class); 
+1

मुझे लगता है कि आपका मतलब है 'कंप्रेसर.class.getConstructor (क्लास.क्लास)। नया इंस्टेंस (कुछ पैरामीटर); ' – lhahne

+1

@lhahne अच्छी तरह से, क्योंकि आपका पैरामीटर प्रकार' क्लास 'है, यह' Some.class' – Bozho

+0

हो सकता है सरल उदाहरण: CreateObjects एक जावा क्लास है, कन्स्ट्रक्टर के लिए किसी भी तर्क के बिना नीचे दिए गए तरीके से नया प्रवेश कर सकता है। 'CreateObjects obj2 = CreateObjects.class.getConstructor()। नया इंस्टेंस(); ' – srinivas

1

आप (Class.getConstructors या Class.getConstructor के माध्यम से जैसे) प्रासंगिक Constructor वस्तु को पाने के लिए और उसके बाद constructor.newInstance कहते हैं, यह तर्क लिए ऐसा करना आवश्यक दे रही है।

-1
class Compresor<T> { 
    private Class<? extends T> clazz; 
    Compresor(final Class<? extends T> cls){ 
     this.clazz = cls 
    } 
} 
+0

जो मैंने नहीं पूछा – lhahne

0

एक उदाहरण आप उपयोग कर सकते हैं इस प्रकार है: कहना Conn डेटाबेस से संबंध है या नहीं।

Class[] btarray = { conn.getClass() };  
try{ 
if (classname != null) { 
pmap = (Mapper) Class.forName(
classname).getConstructor(btarray).newInstance(
new Object[] { conn }); 
} 
} catch (Throwable x) { 
    x.printStackTrace(Log.out); 
} 

btarray आपको कन्स्ट्रक्टर के लिए तर्क में प्रवेश करने की अनुमति देता है।

3

का उपयोग करते हुए स्प्रिंग ClassUtils और BeanUtils कक्षाएं आप उन कठिन अपवाद है कि वसंत के लिए से निपटने के साथ काम कर से बचने कर सकते हैं:

Constructor<Car> constructor = ClassUtils.getConstructorIfAvailable(Wheels.class, Etc.class); 
Car car = BeanUtils.instantiateClass(constructor, new Wheels(), new Etc()); 
संबंधित मुद्दे