2011-02-08 28 views
8

के माध्यम से निजी संपत्ति का उपयोग कर मेरे पास निम्नलिखित पैकेज संरचना और कक्षाएं हैं।जावा प्रतिबिंब

package X 
    Class A 
     private string fieldX; 
     protected string getFieldX(){ return fieldX}; 

package Y 
    Class B extends A 
    Class C extends B 

मैं ClassC वस्तु है और प्रतिबिंब के माध्यम से fieldX प्राप्त करने की कोशिश।

Class partypes[] = new Class[0]; 
Object arglist[] = new Object[0]; 
Method getContextMethod = ClassC.class.getMethod("getFieldX",partypes); 
String retValue = (string) getContextMethod.invoke(classCInstance, arglist); 

लेकिन मुझे NoSuchMethod अपवाद मिल रहा है।

मैंने सीधे फील्डएक्स तक पहुंचने का प्रयास किया। लेकिन इस बार मुझे NoSuchField अपवाद मिल रहा है।

Field reqField = ClassC.class.getDeclaredField("fieldX"); 
reqField.setAccessible(true); 
Object value = reqField.get(classCInstance); 
String retValue = (string) value; 

बात मैं गलत कर रहा हूँ क्या है? क्या क्लाससी ऑब्जेक्ट से इस फील्डएक्स को पाने का कोई तरीका है?

समाधान: (समाधान के लिए बहुत vz0 धन्यवाद);

निजी क्षेत्र के लिए सीधी पहुँच:

Field reqField = ClassA.class.getDeclaredField("fieldX"); 
reqField.setAccessible(true); 
String value = (String)reqField.get(clazzc); 

विधि कॉल;

Class partypes[] = new Class[0]; 
Object arglist[] = new Object[0]; 
Method getContextMethod = ClassA.class.getDeclaredMethod("getFieldX",partypes); 
getContextMethod.setAccessible(true); 
System.out.println((String)getContextMethod.invoke(clazzc, arglist)); 

उत्तर

12

Class.getMethod कॉल सार्वजनिक तरीकों के लिए ही है। आप और Class.getDeclaredMethod कॉल उपयोग करने की आवश्यकता है तो सही पर Method.setAccessible संपत्ति की स्थापना:

Class partypes[] = new Class[0]; 
Object arglist[] = new Object[0]; 
Method getContextMethod = ClassA.class.getDeclaredMethod("getFieldX",partypes); 

getContextMethod.setAccessible(true); 

String retValue = (string) getContextMethod.invoke(classCInstance, arglist); 

संपादित करें: के बाद से getFieldX विधि ClassA पर घोषित किया जाता है, तो आप ClassA से विधि और नहीं ClassC लाने की जरूरत है। getMethod कॉल के विपरीत, getDeclaredMethod पर कॉल करें ignores superclasses

+0

यह काम नहीं करेगा क्योंकि विधि 'कक्षासी' में घोषित नहीं की गई है। – BalusC

+0

टाइपो संपादित, thx। – vz0

+0

स्पष्टीकरण जोड़ा गया। – vz0

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