2016-05-13 49 views
-4

ich eine Methode, mit der Unterschrift nennen save(Object o) auf diese Weise: esden Klassentyp eines Objekts Mit Hilfe einer neuen Instanz erstellen

EntityManager em = new EntityManager(); // My own EntityManager 
User user = new User(); // Constructor provides values 
em.save(user); 

In der Save-Methode, die ich brauche ein neues Objekt, in diesem Fall instanziiert User user = (User) o;

Nun, so weit ich die Klasse des Objekts mit o.getClass() extrahieren kann, was class org.example.User liefert, was User.class ist ich denke: würde User diese Art und Weise Art sein. Aber ich kann mir nicht vorstellen, wie ich damit die Linie User user = (User) o; realisieren könnte.

+3

Was genau ist Ihre Frage? – rmlan

+0

Normalerweise geben Sie die Klasse ein, damit Sie testen können, ob die Besetzung erfolgreich ist. alternativ können Sie 'instanceof' verwenden. Kannst du mehr Kontext dafür liefern, wie du deine gespeicherten "Objekte" ** lädst? –

+0

Fragen Sie "Wie kann ich ein Objekt durch Reflexion instanziieren"? – Siguza

Antwort

1

die Linie Clazz user = (Clazz) o; im save Verfahren zu realisieren, wo Clazz die Klasse des Objekts an die Save-Methode übergeben wird, so dass in diesem Fall User, Sie Verwendung von Generika in der Signatur von save wie folgt machen:

public <T> void save(T user) throws IllegalAccessException, InstantiationException, InvocationTargetException { 
    int i = 0; 
    List<Object> args = new ArrayList<>(); 
    args.add(0,"Example"); 
    T newUser = (T)user.getClass().getConstructors()[i].newInstance(args); 
    // Exciting things... 
} 

Beachten Sie, dass die Art der newUser von der Art des Objekts an die Methode übergeben abgeleitet wird, und dass Sie müssen wissen, welche Objekte werden voraussichtlich an den Konstruktor dieses Typs übergeben werden, zu erstellen, die args Array Andernfalls wird eine Ausnahme ausgelöst. Genauso müssen Sie die Position des Konstruktors im Array kennen, um i zu setzen.

Kurz gesagt, müssen Sie sicher sein, welche Art von Konstruktor das Benutzerargument haben wird, sonst werden Sie in Schwierigkeiten geraten.

Allerdings glaube ich, dass dies Ihre Frage beantwortet.

+0

Ich habe deine Antwort akzeptiert, weil du es versucht hast und die anderen mein Problem nicht verstanden haben (meine Schuld). Bit noch kann ich mit newUser nicht auf die öffentlichen Methoden des Klassenbenutzers zugreifen, der Compiler zeigt mir nur noch die Methoden vom Typ Object an. Danke trotzdem. – Martin

+0

Das ist, weil es nicht weiß, welche Methoden 'T' hat, da es irgendein Objekt sein könnte.Um dies zu erreichen, müssen Sie eine Schnittstelle zu den allen Benutzerklassen gemeinsamen Methoden erstellen und dann sicherstellen, dass alle diese Schnittstelle implementieren, und public 'in' public 'ändern. Auf diese Weise werden die Methoden von UserInterface verfügbar gemacht. –

+0

Ich habe Recht damit, dass Sie Objekte verschiedener Klassen weitergeben werden, nicht nur die 'User'-Klasse, oder? Ansonsten ist das alles übertrieben und Sie könnten auf die Generika verzichten. –

0

Ruft die Methode newInstance() auf Klasse, die Sie benötigen? es wird die gleiche Wirkung wie new User()

bearbeiten haben: ich Ihre Frage auch nicht verstanden, aber ich glaube, ich bin richtig

0

Wenn ich Sie richtig verstehe, Sie versuchen, eine Klasse mit seiner Klasse zu instanziiert Objekt?

Sie können die Klasse erhalten verfügbar Konstrukteuren über Class.getConstructors, dann mit Constructor.newInstance einer von ihnen berufen, Ihre Parameter.

Verwandte Themen