java - Access non-public classes in sun.awt package [specifically: FetcherInfo] -
प्रश्न:
मेरे ऐप में कुछ कार्यक्षमता समस्या है - और अवरोधक sun.awt.image.ImageFetcher.run है, और मैं profiler से किसी भी अधिक (अधिक) अर्थपूर्ण जानकारी प्राप्त नहीं कर सकता। इसलिए मैंने सोचा कि ImageFetcher जो कर रही है वह नौकरियों को देखना अच्छा होगा।
मैं FetcherInfo वर्ग तक पहुंच नहीं पा रहा था, जो कि सभी ImageFetcher नौकरियां रखता है FetcherInfo उदाहरण प्राप्त करने के लिए मुझे FetcherInfo.getFetcherInfo () को कॉल करना है।
मैंने पैकेज sun.awt.image में क्लास बनाया है (बस मेरी परियोजना में, मैं आरटी.जर के साथ टिंकर नहीं किया था)।
प्राप्त करने के लिए FetcherInfo i का उपयोग करें:
प्रयास करें {के लिए (विधि विधि: FetcherInfo.class.getDeclaredMethods ()) {method.setAccessible ( सच); If (method.getName ()। बराबर ("getFetcherInfo")) {m = विधि; }}} पकड़ (अपवाद ई) {e.printStackTrace (); } FetcherInfo info = null; कोशिश {info = (FetcherInfo) m.invoke (नल); } पकड़ (IllegalAccessException ई) {e.printStackTrace (); } पकड़ (InvocationTargetException ई) {e.printStackTrace (); } और मुझे अपवाद मिलता है: थ्रेड में अपवाद "IMAGE-FETCHER-WATCHER" java.lang.IllegalAccessError: कक्षा सूरज तक पहुंचने की कोशिश की। छवि। (विधि विधि: FetcherInfo.class.getDeclaredMethods ()) {
और स्टैक ट्रेस को इंगित करता है:
कोड>पैकेज में अपनी कक्षा डाल दी है संरक्षित सदस्यों को इसेवही अपवाद उठाया गया था:
FetcherInfo.class.getMethod ("getFetcherInfo");तो किसी के पास भी कोई विचार है कि कैसे:
- ImageFetcher उदाहरण प्राप्त करें
- पता लगाएँ कि कौन से चित्र लोड हो रहे हैं
समाधान
समस्या यह थी कि मैंने प्रवेश करने के लिए
sun.java.awt rt.jarमें डाल दिए बिना पैकेज करने के लिए, और अपवाद मुर्गी कोImageFetcher.classकॉल कर दिया गया था।
गैर-सुलभ सदस्यों तक पहुंचने के लिए सेट-पहुंच (सच) का उपयोग करें। (किसी सुरक्षा प्रबंधक के बिना, सूरज। * वर्गों पर प्रतिबिंब के साथ उपयोग किए जाने से कोई ब्लॉक नहीं है।)
import java.lang.reflect.Method; सार्वजनिक कक्षा एक्सेस {सार्वजनिक स्थिर शून्य मुख्य (स्ट्रिंग [] आर्ग्स) अपवाद फेंकता है {क्लास & lt;? & Gt; ImageFetcher = वर्ग। ForName ("sun.awt.image.FetcherInfo"); के लिए (विधि विधि: imageFetcher.getDeclaredMethods ()) {; } विधि विधि = imageFetcher.getDeclaredMethod ("getFetcherInfo"); method.setAccessible (सही); ऑब्जेक्ट फ़ेचर = method.invoke (null); System.err.println (फ़ेचर); }}
Comments
Post a Comment