2011-01-22 10 views
15

Jeśli mam dwie klasy, "A" i "B", w jaki sposób mogę utworzyć ogólną fabrykę, więc będę musiał tylko przekazać nazwę klasy jako ciąg znaków, aby odebrać instancję?Tworzenie instancji z łańcucha znaków w języku Java

Przykład:

public static void factory(String name) { 
    // An example of an implmentation I would need, this obviously doesn't work 
     return new name.CreateClass(); 
} 

Dzięki!

Joel

+4

wracasz w 'void' –

Odpowiedz

18
Class c= Class.forName(className); 
return c.newInstance();//assuming you aren't worried about constructor . 

wywoływania konstruktora z argumentu

public static Object createObject(Constructor constructor, 
     Object[] arguments) { 

    System.out.println("Constructor: " + constructor.toString()); 
    Object object = null; 

    try { 
     object = constructor.newInstance(arguments); 
     System.out.println("Object: " + object.toString()); 
     return object; 
    } catch (InstantiationException e) { 
     //handle it 
    } catch (IllegalAccessException e) { 
     //handle it 
    } catch (IllegalArgumentException e) { 
     //handle it 
    } catch (InvocationTargetException e) { 
     //handle it 
    } 
    return object; 
    } 
} 

mają look

+0

Jak mogę wysłać argumenty do konstruktora? – Joel

+0

zaktualizowano ............ –

+1

'System.out.println (e);' Proszę, NIGDY! Dlaczego po prostu nie deklarujesz wyjątku? Kiedy * naprawdę * masz ochotę poradzić sobie z nim przez raportowanie, użyj 'e.printStackTrace()'. – maaartinus

4

Można przyjrzeć Reflection:

import java.awt.Rectangle; 

public class SampleNoArg { 

    public static void main(String[] args) { 
     Rectangle r = (Rectangle) createObject("java.awt.Rectangle"); 
     System.out.println(r.toString()); 
    } 

    static Object createObject(String className) { 
     Object object = null; 
     try { 
      Class classDefinition = Class.forName(className); 
      object = classDefinition.newInstance(); 
     } catch (InstantiationException e) { 
      System.out.println(e); 
     } catch (IllegalAccessException e) { 
      System.out.println(e); 
     } catch (ClassNotFoundException e) { 
      System.out.println(e); 
     } 
     return object; 
    } 
} 
Powiązane problemy