2011-10-31 37 views
5

मैं एक URLClassLoader के माध्यम से एक वर्ग लोड करने की कोशिश कर रहा हूं (ठीक है, यह न तो एक सामान्य वर्ग लोडर के साथ काम करता है) और चाहते हैं कि उन्हें कोई अनुमति न हो।जावा प्रतिबिंब अनुमति त्रुटि

इसलिए, मैंने अपना स्वयं का सुरक्षा प्रबंधक बनाया, जो स्टार्टअप पर एक कुंजी उत्पन्न करता है, जो केवल एक बार (मुख्य धागे में) अनुरोध कर सकता है। सुरक्षा प्रबंधक में 2 सूचियां हैं, एप्लिकेशन थ्रेड, जिसे किसी भी अधिकार और अस्थायी सूची दी जाएगी, जिसे केवल एक बार दिया जाएगा (यह प्रतिबिंब के बारे में है)।

यह बहुत descripe के लिए कठिन है के रूप में, मैं पूरी बात अपलोड करने का निर्णय: नीचे दिए गए लिंक पर नज़र

ठीक है, वापस आ रहा: अगर धागा नहीं है मैं एक निगरानी धागा है, जो की जाँच करता है बनाया बहुत अधिक समय ले लो।

जब मैं अब URL क्लासलोडर से दो कक्षाओं को उदाहरण देना शुरू करता हूं, तो मुझे बिना किसी त्रुटि के 30 तरीके पर कॉल किया जाता है, लेकिन 31 कॉल पर, यह निम्नलिखित के लिए अनुमतियों की जांच करने का प्रयास करता है लेकिन यह 30 वें कॉल के बाद बस खुश होता है।

 
java.lang.RuntimePermission accessClassInPackage.sun.reflect), 

क्या किसी को पता है कि वहां क्या हो रहा है?

संपादित करें: मेरे पास उदाहरण को तोड़ने का समय था। http://myxcode.at/securitymanager.zip मुझे पता चला कि सुरक्षा प्रबंधक को तुल्यकालिक नहीं पूछा जाता है। बस कोड के इस छोटे टुकड़े को चलाएं और लाल रेखाओं पर नज़र डालें।

यदि लाल रेखाएं पहली पंक्ति में आती हैं, तो बस प्रोग्राम को फिर से चलाएं, आपको पता चल जाएगा कि यह थोड़ा अनियंत्रित लगता है।

समस्या कम या ज्यादा है, मुझे सुरक्षा प्रबंधक को सिंक्रनाइज़ करने की आवश्यकता है। यहां उन लोगों के लिए मेरा आउटपुट है जो त्रुटि का सामना नहीं कर सकते हैं (बग?) http://pastebin.com/E9yLRLif

संपादित 2: शायद यह कंसोल के बारे में है? शायद कंसोल बहुत धीमा है?

+2

उबाल लें आपकी समस्या को इस्तेमाल कर सकते हैं और इसे यहाँ पोस्ट अक्षम करने के लिए। –

+1

ठीक है, यह है;) –

उत्तर

4

मेरे लिए जाँच तब होता है जब i=15:

checkPermission ((java.lang.RuntimePermission accessClassInPackage.sun.reflect)) थ्रेड के लिए [मुख्य, 5, मुख्य] ​​

कारण

public Object invoke(Object obj, Object[] args) 
     throws IllegalArgumentException, InvocationTargetException { 
    if (++numInvocations > ReflectionFactory.inflationThreshold()) { 
     MethodAccessorImpl acc = (MethodAccessorImpl) new MethodAccessorGenerator() 
       .generateMethod(method.getDeclaringClass(), method 
         .getName(), method.getParameterTypes(), 
         method.getReturnType(), method 
           .getExceptionTypes(), method 
           .getModifiers()); 
     parent.setDelegate(acc); 
    } 

    return invoke0(method, obj, args); 
} 
: देरी अनुमति की जांच के लिए ReflectionFactory वर्ग का inflationThreshold जो NativeMethodAccessorImpl.java की invoke विधि द्वारा इस्तेमाल किया जाता है

देरी यदि आप एक छोटे, संक्षिप्त, पूर्ण उदाहरण के लिए नीचे प्रतिबिंब एपीआई :)

Field hack = Class.forName("sun.reflect.ReflectionFactory").getDeclaredField("inflationThreshold"); 
hack.setAccessible(true); 
hack.set(null, 0); 
+1

मेरा जेडीके संस्करण 1.6.0_23 बीटीडब्ल्यू – jeha

+0

काम किया, धन्यवाद! –

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