How can I load java class from database? -


निम्न स्रोत कोड की तरह:

  पैकेज util.abc; सार्वजनिक वर्ग की परीक्षा {सार्वजनिक स्ट्रिंग आउट () {वापसी "हैलो वर्ल्ड!"; }}   

मैं उपयोग कर सकता हूँ:

  वर्ग c = Class.forName ("util.abc.teest"); इस कक्षा को प्राप्त करने के लिए   

, लेकिन मुझे यह वर्ग फ़ाइल ( test.java ) को क्लासपाथ / util / abc / में रखना होगा

मैं चाहता हूँ कि गतिशील इस वर्ग को डेटाबेस से लोड करें (स्रोत कोड को string , या binary के रूप में स्टोर करें)

यह संभव है ?

मदद के लिए धन्यवाद:)

मान लें कि आप पहले से ही कक्षा संकलित हैं, तो आप एक DatabaseClassLoader बना सकता है, जो एक डेटाबेस से वर्ग को लोड करता है।

  सार्वजनिक वर्ग DatabaseClassLoader ClassLoader का विस्तार करता है {सार्वजनिक DatabaseClassLoader (ClassLoader अभिभावक, ... / * डेटाबेस से कनेक्शन * /) {सुपर (मूल); // कनेक्शन को स्टोर करें} सार्वजनिक कक्षा खोज क्लास (स्ट्रिंग का नाम) {बाइट [] डेटा = लोडडेटाफ़ॉर्मडेटाबेस (नाम); वापसी defineClass (नाम, डेटा, 0, data.length); } निजी बाइट [] loadDataFromDatabase (स्ट्रिंग नाम) {// यह आपका काम है। }}   

यदि डेटाबेस में केवल स्रोत कोड होता है, तो आपको इसे पहले संकलित करना होगा - जावा कम्पाइलर एपीआई पर गौर करें कि यह बिना किसी फाइल्स के कैसे करें।

ध्यान दीजिए, क्लास लोड किए गए इस तरह से जीवित रहेंगे जब तक कि क्लासलोडर जीवित नहीं रह जाता है, तो आपको परिवर्तन के मामले में क्लास लोड करने में सक्षम होने के लिए एक नया वर्ग लोडर की आवश्यकता होगी।

इसके अलावा, यदि आप प्रतिबिंब से अन्य तरीकों से कक्षा के साथ सहभागिता करना चाहते हैं, तो आप बेहतर इसे कुछ अंतरफलक (जो कि आपके वर्ग पथ में है) को लागू करने के लिए बेहतर होगा, और आवेदन वर्ग लोडर को आपके डेटाबेस वर्ग लोडर के मूल होने दें। / P>

आह, और लोड करने के तरीके:

  वर्ग & lt;? & Gt; C = Class.forName ("util.abc.teest", myClassLoader);   

या सीधे

  वर्ग & lt;? & Gt; C = myClassLoader.loadClass ("util.abc.Test");   

यहाँ एक तरीका है जो आपके इंटरफेस (वास्तव में किसी भी इंटरफ़ेस के) की वस्तुएं बनाता है:

  सार्वजनिक ; X & gt; एक्स getImplementingObject (कक्षा & lt; X & gt; इंटरफ़ेस क्लास, स्ट्रिंग क्लासनाम) क्लासनोटफ़ाउंड एक्स्प्लेशन फेंकता है, अवैध एक्सेस एक्सेस, इंस्टेंटेशन अपेशन {क्लास लोडर लोडर = नया डाटाबेस क्लास लोडर (इंटरफ़ेस क्लास। टैग क्लासलोडर (), ...); कक्षा के & lt;? & Gt; Cl = loader.loadClass (क्लासनाम); क्लास के लिए & lt ;? एक्स & gt; फैली C = cl.asSubclass (इंटरफ़ेस क्लास); वापसी c.newInstance (); }   

(इसके लिए क्लास को कोई नॉन-आरिफ कन्स्ट्रक्टर बनाने की आवश्यकता होती है जो किसी भी अपवाद को नहीं फेंकता है, जरूर (यदि ऐसा होता है, तो आपको यह अपवाद भी फेंक दिया जाएगा)। / P>

यह हर तरह की कक्षा के लिए एक नया क्लासलोडर बनाता है, इसलिए वे इंटरफ़ेस (या रिफ्लेक्शन) के माध्यम से केवल एक-दूसरे के साथ सहयोग कर सकते हैं।

पर- जावा कंप्लरर एपीआई को देखो, जैसा कि डीसीएन से जवाब में दिया गया है। लेकिन मुझे लगता है कि उस पक्ष पर संकलन करने में बेहतर होगा जो कक्षाओं को उस पक्ष की तुलना में डालती है जो उन्हें खींचती है ।

Comments