2016-06-18 9 views
6

साथ java.io.Serializable हो रही मैं निम्नलिखित कोड है:Javassist NotFoundException जब JDK9

private static CtClass resolveCtClass(String clazz) throws NotFoundException { 
    ClassPool pool = ClassPool.getDefault(); 
    return pool.get(clazz); 
} 

जब JDK8 के तहत चल रहा है, अगर इस पद्धति का उपयोग कर java.io.Serializable कहा जाता है, यह काम करता है, लेकिन जब JDK9 वातावरण के अंतर्गत चलाते , यह NotFoundException फेंकता है।

क्या मैंने यहां कुछ अनदेखा किया है?

उत्तर

6

यह अब जावा 9 के मौजूदा ईए बिल्डों के साथ नहीं होता है। क्लास फाइलें अब मॉड्यूल में encapsulated होने के बावजूद हमेशा locatable हैं।

यह जावा 9 के मॉड्यूल encapsulation का एक परिणाम है जहां गैर-निर्यातित संसाधन अब ClassLoader API के माध्यम से उपलब्ध नहीं हैं। कवर के तहत, Javassist

ClassLoader.getSystemClassLoader().findResource("java/io/Serializable.class"); 

कॉल Serializable के लिए वर्ग फ़ाइल की पकड़ पाने के लिए। यह तब इस वर्ग फ़ाइल को पार करता है और जावा प्रतिबिंब एपीआई के समान जानकारी का प्रतिनिधित्व करता है लेकिन कक्षा को लोड किए बिना इसे लोड करने से पहले इसे संपादित किया जा सकता है।

जावा 8 तक, यह क्लास फ़ाइल सुलभ थी क्योंकि अधिकांश क्लास लोडर इसे लोड करने से पहले एक क्लास फ़ाइल को देखने पर भरोसा करते थे जैसे उपरोक्त कॉल फ़ाइल को इंगित करने के लिए URL लौटाता है। जावा 9 के बाद से, नामित मॉड्यूल के संसाधन केवल नई एपीआई विधि findResource(String, String) के माध्यम से उपलब्ध हैं जहां दूसरे तर्क उस वर्ग के मॉड्यूल को नामित करते हैं।

संक्षिप्त उत्तर यह है: जावासिस्ट जावा 9 के साथ काम नहीं करता है और its dependant projects में से कोई भी नहीं होगा। वर्तमान जावा 9 कार्यान्वयन के साथ यह known issue है और आशा है कि रिलीज से पहले तय किया जाएगा।

1

(मैं इस्तेमाल कभी नहीं किया Javassist तो मैं बस अंधेरे में शूटिंग कर रहा हूँ, यहाँ ...)

documentation of ClassPool का कहना है:

हैं get() इस वस्तु पर कहा जाता है, यह विभिन्न स्रोतों खोज एक वर्ग फ़ाइल खोजने के लिए ClassPath द्वारा प्रतिनिधित्व किया गया और फिर यह उस श्रेणी फ़ाइल का प्रतिनिधित्व करने वाले CtClass ऑब्जेक्ट बनाता है।

यह कक्षा पथ की अवधारणा से बंधे प्रतीत होता है। ClassPath और CtClass पर देखकर उस धारणा का समर्थन करता है।

यदि ऐसा है, तो जावासिस्ट जेडीके 9 के ब्रांड नए modules में देखने के लिए उपयुक्त नहीं हो सकता है।

यदि मेरा अनुमान सही है, तो आपको पूल से जेडीके कक्षा प्राप्त करने में सक्षम नहीं होना चाहिए। यह आसानी से सत्यापित किया जाना चाहिए।

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