2012-02-20 8 views
8

मैं एक उपयोगिता विधि है फेंक:कैसे Class.getMethod बनाने के लिए() एक विशेष क्षेत्र के लिए एक वस्तु के गेटर विधि (प्रतिबिंब का उपयोग कर) को खोजने के लिए एक SecurityException

public static Method findGetter(final Object object, final String fieldName) { 
    if(object == null) { 
     throw new NullPointerException("object should not be null"); 
    } else if(fieldName == null) { 
     throw new NullPointerException("fieldName should not be null"); 
    } 

    String getterName = getMethodNameForField(GET_PREFIX, fieldName); 

    Class<?> clazz = object.getClass(); 
    try { 
     return clazz.getMethod(getterName); 
    } catch(final NoSuchMethodException e) { 
     // exception handling omitted 
    } catch(final SecurityException e) { 
     // exception handling omitted 
    } 
} 

मैं एक इकाई परीक्षण लिखने के लिए चाहते हैं कि SecurityException परिदृश्य को कवर करता है, लेकिन मैं getMethod को सुरक्षा अपवाद कैसे फेंक सकता हूं?

जावाडोक कहा गया है कि getMethod SecurityException

फेंक देंगे एक सुरक्षा प्रबंधक, रों, मौजूद है और निम्नलिखित से कोई भी शर्त पूरी की जाती है:

  • s.checkMemberAccess के आह्वान (यह, सदस्य। PUBLIC) विधि

  • तक पहुंच से इनकार करता है कॉलर का क्लास लोडर कक्षा एल के पूर्वजों के समान नहीं है। वर्तमान वर्ग और s.checkPackageAccess() के आह्वान के लिए oader इस वर्ग

मैं नहीं बल्कि एक मजाक ढांचे का सहारा से, आम तौर पर अपवाद को गति प्रदान करना पसंद करेंगे के पैकेज के लिए उपयोग से इनकार करते हैं।

उत्तर

11
System.setSecurityManager(new SecurityManager(){ 
    @Override 
    public void checkMemberAccess(Class<?> clazz, int which) { 
     throw new SecurityException("Not allowed") 
    } 
    @Override 
    public void checkPermission(Permission perm) { 
     // allow resetting the SM 
    } 
}); 
ClassTest.class.getMethod("foo"); 

एक finally ब्लॉक में System.setSecurityManager(null) कॉल करने के लिए मूल राज्य को बहाल करने के लिए याद रखें।

+0

धन्यवाद @ बोझो! यह एक बेहद असंभव परिदृश्य है, लेकिन परीक्षण करना सक्षम होना अच्छा है। –

0

जहां तक ​​यह नियमित सेटिंग में होता है, वहां बहुत कम मामले होते हैं जहां यह हो सकता है।

गैर-सार्वजनिक विधियों के परिणामस्वरूप NoSuchMethodException होगा, क्योंकि getMethod विशेष रूप से केवल सार्वजनिक विधियों की तलाश करता है। getDeclaredMethod विधि पायेगी, लेकिन निजी/संरक्षित तरीकों को वापस करने की अनुमति देता है।

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

आपकी सर्वश्रेष्ठ शर्त सुरक्षा प्रबंधक को ओवरराइड करके विशिष्ट तरीकों के लिए अपवाद को फेंकने के लिए मजबूर कर रही है।

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

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