2013-05-10 19 views
6

Czy jest możliwe dodanie metody do klasy poprzez odbicie w java?Dodawanie nowej metody do klasy poprzez odbicie

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

Jaki jest * rzeczywisty problem *, który próbujesz rozwiązać. Prawdopodobnie istnieje łatwiejszy sposób na jego wdrożenie. – parsifal

+0

To jest to, czego chcę ..... http: //stackoverflow.com/questions/16482686/adding-getters-setters-to-one-base-class –

Odpowiedz

11

Nie, nie poprzez odbicie.

Odbicie pyta o zajęcia i ich członków, możesz zmienić pola, ale nie możesz tworzyć nowych. Nie możesz dodawać nowych metod.

Możesz użyć a bytecode manipulation library, aby dodać metody do klas; ale dlaczego miałbyś chcieć?

Nie można wywoływać metod mimo, że za pomocą refleksji, ponieważ one oczywiście nie istnieją w czasie kompilacji.

Może przyjrzeć się project Lombok - jest to preprocesor adnotacji, który może dodawać metody do klas w czasie kompilacji. To doda automagicznie moduły pobierające i ustawiające, o ile twoje klasy są poprawnie adnotowane.

+0

Aby dodać do odpowiedzi Borisa, pamiętaj, że używasz statycznie napisanego języka. Jeśli chcesz czegoś bardziej dynamicznego, spójrz na ruby ​​lub pytona – cmbaxter

+1

@Boris ..... Pls sprawdź mój poprzedni post. http://stackoverflow.com/questions/16482686/adding-getters-setters-to-one-base-class –

+0

@TapasJena pytanie dotyczyło kompilacji genericów czasu, to pytanie dotyczy refleksji w środowisku wykonawczym - nie są one tak naprawdę powiązane. –

0

Nie. Nie można dodawać metod za pomocą refleksji. W tym przypadku użyję języka skryptowego, takiego jak Beanshell 2. Oto klasa 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); 
    } 

} 

Teraz przykładem dynamiczny obiekt będzie wyglądać

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 
Powiązane problemy