2016-03-31 14 views
2

Ich versuche, ein Objekt mit Reflexion wie diese zu schaffen (vielleicht ist dies keine gute Architektur, aber ich bin gerade dabei einige Tests)Erstellen Sie ein Objekt durch Reflexion

package com.interfaces; 

public interface IEmployee { 
    List<entities.Employee> getEmployees(); 
} 

dann

package com.personnel; 

public class Employee implements IEmployee{ 
    public Employee(){} 

    public List<entities.Employee> getEmployees(){ 
    ... 
    } 
} 

dann in einer anderen Klasse

package com.factory; 

import java.lang.reflect.Constructor; 

public final class EmployeeFactory { 

    private static String path = "com.personnel"; 

    public EmployeeFactory() {} 

    public static interfaces.IEmployee CreateEmployee(){ 
     String className = path + ".Employee"; 
     try { 
      Class<?> cls = Class.forName(className); 
      Object object = cls.newInstance(); 
      return (interfaces.IEmployee)object; 
     } catch (Exception e) { 
      System.out.println(e.getMessage()); 
      return null; 
     } 

    } 

} 

dann in einer anderen Klasse

public final class PersonnelService { 

    private static interfaces.IEmployee employeeFactory = com.factory.EmployeeFactory.CreateEmployee(); 

    public List<entities.Employee> getEmployees(){ 
     return employeeFactory.getEmployees(); 
    } 

} 

schließlich in meinem Haupt-Methode

public static void main(String[] args) { 
    List<entities.Employee> employees = new com.services.PersonnelService().getEmployees(); 
    for(entities.Employee employee : employees){ 
     System.out.println(employee.getEmployeeName()); 
    } 

, wenn der Code der Klasse cls ankommt = Class.forName (classname) wirft die Ausnahmemeldung „com.personnel.Employee. (Java.lang.String) "mit" NoSuchMethodException ".


UPDATE

fand ich das Problem. In der Tat war es eine schlechte Namenskonvention. Ich hatte eine serialisierbare Employee-Klasse (mein Pojo) und eine Employee-Klasse, die meine Schnittstelle IEmployee implementiert, die DB-Operationen ausführen soll. Ich habe das letzte als EmployeeDAL umbenannt und es hat funktioniert. Sogar ich habe den vollständigen Klassennamen definiert, wie Sie im Beispiel sehen können, es sieht so aus, als ob ich versucht habe, meinen serialisierbaren Pojo zu instantiieren (ich verstehe es immer noch nicht, aber ...). Vielen Dank für Ihre Zeit.

+0

Basierend auf der Fehlermeldung ändern würde es irgendwie scheinen. (Java.lang.String) mit classname immer hinzugefügt, aber ich kann nicht sehen, wie. Ist das alles dein relevanter Code? – Natecat

+0

Ja, ist es. Im Wesentlichen enthält die Variable className den String, der von der Ausnahme zurückgegeben wird: «com.personnel.Employee». Die drei Perioden sind db connect, um meine Angestellten zu bekommen, aber ich kann nicht dorthin gelangen. –

+0

Hier fehlt etwas. 'NoSuchMethodException' ist eine geprüfte Ausnahme, aber Sie haben keine Methode angezeigt, die sie möglicherweise auslösen könnte. –

Antwort

0

Ich habe versucht, Ihren Code zu reproduzieren und keinen Fehler in diesem Code gefunden. Ich bekomme nur NoSuchMethodException Meldung, wenn ich Mitarbeiter Konstruktor mit String-Argumente

package com.agit.example.test; 

import java.util.ArrayList; 
import java.util.List; 

public class TestClass { 
    public static void main(String[] args) { 
     List<Employee> employees = new PersonnelService().getEmployees(); 
     for(Employee employee : employees){ 
      System.out.println(employee); 
     } 
    } 
} 

interface IEmployee { 
    List<Employee> getEmployees(); 
} 

class Employee implements IEmployee{ 
    public Employee(){} 

    public List<Employee> getEmployees(){ 
     List<Employee> x = new ArrayList<>(); 
     x.add(this); 
     return x; 
    } 
} 

final class EmployeeFactory { 

    private static String path = "com.agit.example.test"; 

    public EmployeeFactory() {} 

    public static IEmployee CreateEmployee(){ 
     String className = path + ".Employee"; 
     try { 
      Class<?> cls = Class.forName(className); 
      Object object = cls.newInstance(); 
      return (IEmployee)object; 
     } catch (Exception e) { 
      System.out.println(e.getMessage()); 
      return null; 
     } 

    } 

} 

final class PersonnelService { 

    private static IEmployee employeeFactory = EmployeeFactory.CreateEmployee(); 

    public List<Employee> getEmployees(){ 
     return employeeFactory.getEmployees(); 
    } 

} 
Verwandte Themen