2013-05-10 4 views
6

क्या जावा में प्रतिबिंब के माध्यम से कक्षा में एक विधि जोड़ना संभव है ??प्रतिबिंब के माध्यम से कक्षा में नई विधि जोड़ना

public class BaseDomain { 

    public BaseDomain(){ 
     Field[] fields = this.getClass().getDeclaredFields(); 
     for(int i=0; i<fields.length; i++){ 
      String field = fields[i].toString(); 

      String setterMethod = "public void set" + field.toLowerCase(); 

      //Now I want to add this method to this class. 

     } 
    } 
} 
+2

http://stackoverflow.com/questions/6680674/can-a-java-class-add-a-method दिखाई देंगी -to-yourself-at-runtime –

+0

* वास्तविक समस्या * क्या है जिसे आप हल करने का प्रयास कर रहे हैं। इसे लागू करने के लिए शायद एक आसान तरीका है। – parsifal

+0

यह वही है जो मैं चाहता हूं ..... http: //stackoverflow.com/questions/16482686/adding-getters-setters-to-one-base-class –

उत्तर

11

नहीं, प्रतिबिंब के माध्यम से नहीं।

प्रतिबिंब कक्षाओं और उनके सदस्यों के बारे में पूछता है, आप फ़ील्ड बदल सकते हैं लेकिन आप नए नहीं बना सकते हैं। आप नई विधियां नहीं जोड़ सकते हैं।

कक्षाओं में विधियों को जोड़ने के लिए आप bytecode manipulation library का उपयोग कर सकते हैं; लेकिन तुम क्यों करना चाहते हो?

आप प्रतिबिंब के माध्यम से वैसे भी विधियों को कॉल नहीं कर सकते क्योंकि वे स्पष्ट रूप से संकलन समय पर मौजूद नहीं होंगे।

शायद project Lombok पर एक नज़र डालें - यह एक एनोटेशन पूर्वप्रक्रमक कि संकलन समय पर कक्षाओं के लिए तरीकों जोड़ सकते हैं। जब तक आपकी कक्षाओं को सही ढंग से एनोटेट किया जाता है तब तक यह स्वचालित रूप से गेटर्स और सेटर्स को स्वचालित रूप से जोड़ देगा।

+0

बोरिस के उत्तर में जोड़ने के लिए, याद रखें कि आप एक स्थिर टाइप की गई भाषा का उपयोग कर रहे हैं। यदि आप कुछ और गतिशील चाहते हैं तो रूबी या पायथन – cmbaxter

+1

@ बोरीस ..... Pls मेरी पिछली पोस्ट की जांच करें। http://stackoverflow.com/questions/16482686/adding-getters-setters-to-one-base-class –

+0

@TapasJena वह सवाल संकलित समय जेनरिक के बारे में था, यह सवाल रनटाइम प्रतिबिंब के बारे में है - वे वास्तव में संबंधित नहीं हैं। –

0

नहीं। आप प्रतिबिंब के माध्यम से तरीकों को जोड़ नहीं सकते हैं। इस मामले में, मैं Beanshell 2 जैसे स्क्रिप्टिंग भाषा का उपयोग करूंगा। यहाँ एक DynamicObject वर्ग

public class DynamicObject 
{ 

    bsh.Interpreter interpreter = null; 

    public DynamicObject() 
    { 
     interpreter = new bsh.Interpreter(); 
    } 

    public void addToSource(String... method) 
    { 
     try 
     { 
      String main = ""; 
      for (int i=0; i<lines.length; i++){ 
       main += lines[i] + "\n"; 
      } 
      interpreter.eval(main); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    public Object invoke(String methodname, Object... args) 
    { 
     try 
     { 
      return interpreter.getNameSpace().invokeMethod(methodname, args, bsh); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    public Object invoke(String methodname) 
    { 
     return invoke(methodname, (Object[])null); 
    } 

} 

अब एक उदाहरण गतिशील वस्तु की तरह

DynamicObject testObj = new DynamicObject(); 

testObj.addToSource(

    "public int add (int a, int b)", 
    "{", 
     "return a+b;", 
    "}" 

); 

int added = testObj.invoke("add", 5, 4); // is 9 
संबंधित मुद्दे