मैं गतिशील रूप से एक जावा। क्लास फ़ाइल लोड करने की कोशिश कर रहा हूं और प्रतिबिंब द्वारा इसे कॉल करता हूं।जावा क्लासलोडिंग बहुत धीमी गति से चल रही है?
मुझे फू नामक एक कक्षा मिली है; इसमें एक खाली कन्स्ट्रक्टर है और इसमें एक विधि है जिसे डिट() कहा जाता है जो स्ट्रिंग तर्क लेता है और स्ट्रिंग देता है। इसके अलावा यह स्ट्रिंग को उलट देता है।
URL url = new URL("file://C:/jtest/");
URLClassLoader loader = new URLClassLoader(new URL[]{url});
Class<?> cl = loader.loadClass("Foo");
Constructor<?> cons = cl.getConstructor((Class[])null);
Object ins = cons.newInstance(new Object[]{});
Method meth = cl.getDeclaredMethod("doit", String.class);
Object ret = meth.invoke(ins, new Object[]{"!dlroW olleH"});
System.out.println((String)ret);
जैसी उम्मीद थी इस प्रिंट:
यहाँ मेरी कोड है "नमस्ते दुनिया!"। हालांकि, इसे पूरा करने के लिए लगभग 30 सेकंड लगता है। मुझे पता है कि प्रतिबिंब धीमा है, लेकिन मुझे उम्मीद है कि यह 10 एमएस या कुछ हो।
मैं जेआरई 1.6.0_13 के साथ एक्लिप्स का उपयोग कर रहा हूं, और मैं विंडोज विस्टा चला रहा हूं।
मैं यहाँ क्या गलत कर रहा हूं?
धन्यवाद।
संपादित करें: मैंने कोड प्रोफाइल किया है, और इसका पूरा समय तीसरी पंक्ति (loadClass()) में उपयोग किया जाता है। बाकी सब कुछ तुरंत होता है।
संपादित करें: मैंने कोड को लूप में रखा है; धीमी गति किसी भी तरह अनुकूलित हो जाती है और केवल पहले लूप पर 30 सेकंड लेती है।
संपादित करें: मुझे समाधान मिला है।
बजाय:
URL url = new URL("file:/C:/jtest/");
अब यह पूरी तरह से काम करता है:
URL url = new URL("file://C:/jtest/");
मैं यह करने के लिए बदल दिया है। मुझे नहीं पता कि यह क्यों काम करता है, लेकिन मुझे नहीं लगता कि मैं (और 5 अन्य लोग) इसे कैसे चूक सकते थे। अब मुझे गूंगा लगता है ..
लोड क्लास पहली बार कैश की जांच करता है यह देखने के लिए कि कक्षा पहले ही लोड हो चुकी है, अगर मुझे सही याद है। यह समझाएगा कि दूसरे पुनरावृत्ति पर लंबे समय तक क्यों नहीं लगता है। –
क्या पैकेज में असली "फू" है? डिफ़ॉल्ट पैकेज से लोड हो रहा है (कोई पैकेज नहीं) अजीब प्रभाव हो सकता है। Foo.Foo पर जाने का प्रयास करें। – flicken
यह दिलचस्प है ... नया यूआरएल ("फाइल:/सी:/जेटेस्ट /")। GetPath() है/सी:/jtest /। मुझे आश्चर्य है कि URLClassLoader इसका अर्थ कैसे करता है। –