2016-12-01 2 views
2

Ich habe eine Funktion erstellt, die einen Parameter vom Typ Object erfordert.Java Convert Object Dynamic zu Entität

Jetzt habe ich 20 verschiedene Entitäten, so dass der angegebene Objektparameter vom Typ dieser 20 Entitäten sein kann. Ich suche nach einer Möglichkeit, dieses Objekt in den richtigen Entity-Typ zu werfen und alle Werte davon zu bekommen.

Im Moment habe ich die richtige Art mit diesem bekommen, aber ich weiß nicht, wie es um diese Art zu gießen und die Felder sind immer 0.

System.out.println("Class: " + obj.getClass());//Gives me the right type 
System.out.println("Field: " + obj.getClass().getFields().length);//Length is always 0 
+0

Sie meinen 'Casting'. – xenteros

+0

Sind die Felder öffentlich? –

+0

Felder sind privat mit Getter/Setter – TheNewby

Antwort

1

könnten Sie mögen diese versuchen, Reflexion mit den deklarierten Felder jedes Entity-Objekt abzurufen:

Modelle
public class CastingTest { 

    public static void cast(Object o) throws IllegalArgumentException, IllegalAccessException{ 
     Class<? extends Object> clazz = o.getClass(); 
     //clazz.cast(o); 
     System.out.println(clazz.getName() + " >> " + clazz.getDeclaredFields().length); 
     for(Field f: clazz.getDeclaredFields()){ 
      f.setAccessible(true); 
      System.out.println(f.getName() + "=" + f.get(o)); 
     } 
    } 

    public static void main(String args[]) throws IllegalArgumentException, IllegalAccessException{ 
     CastingTest.cast(new ClassA("A","B",1)); 
     CastingTest.cast(new ClassB("A","B",2.25)); 
    } 
} 

Testing. ClassA:

public class ClassA { 

    private String a; 

    private String b; 

    private int c; 

    /** 
    * @param a 
    * @param b 
    * @param c 
    */ 
    public ClassA(String a, String b, int c) { 
     super(); 
     this.a = a; 
     this.b = b; 
     this.c = c; 
    } 

} 

Testen von Modellen. ClassB:

public class ClassB { 

    private String varA; 

    private String varC; 

    private double value; 

    /** 
    * @param varA 
    * @param varC 
    * @param value 
    */ 
    public ClassB(String varA, String varC, double value) { 
     super(); 
     this.varA = varA; 
     this.varC = varC; 
     this.value = value; 
    } 

} 

Und die Ausgabe:

com.test.ClassA >> 3 
a=A 
b=B 
c=1 
com.test.ClassB >> 3 
varA=A 
varC=B 
value=2.25 
+0

Vielen Dank! Das habe ich gesucht – TheNewby

0
public void myFunction(Object obj) { 

    if (obj instanceof MyEntity) { 

     MyEntity entity = (MyEntity) obj; 
     // use entity instance as you need.. 
    } 
} 
+1

Ich hatte diese Lösung zu, aber auf der Suche nach etwas Dynamisches. Also muss ich ein if/else if construct für alle meine 20 Entities erstellen – TheNewby

+1

@TheNewby Vielleicht Java-Generika sind, was Sie suchen? – Hexaholic

0

Sie können Reflektion verwenden, wie folgt:

davon ausgehen, dass Sie eine Datenklasse wie das folgende haben:

public class User { 
    private String username; 
    private String password; 

    public void setPassword(final String password) { 
     this.password = password; 
    } 

    public void setUsername(final String username) { 
     this.username = username; 
    } 

    public String getPassword() { 
     return this.password; 
    } 

    public String getUsername() { 
     return this.username; 
    } 

    public User() { 
     // TODO Auto-generated constructor stub 
    } 
} 

Sie eine Methode schreiben können Reflektion verwenden folgt als:

import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 

public class Test { 
    public static void main(final String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, 
    IllegalAccessException, IllegalArgumentException, InvocationTargetException { 

     User user = new User(); 
     user.setPassword("john"); 
     user.setUsername("doe"); 
     testMethod(user); 
    } 

    private static void testMethod(final Object obj) throws ClassNotFoundException, NoSuchMethodException, SecurityException, 
     IllegalAccessException, IllegalArgumentException, InvocationTargetException { 
     Class clzz = Class.forName(obj.getClass().getCanonicalName()); 
     Method method = clzz.getDeclaredMethod("getUsername"); 
     System.out.println(method.invoke(obj)); 
    } 
} 
0

nicht wirklich die Antwort fragte Sie, aber ich glaube, Sie suchen: Die Sie Use Case beschrieben ist, was welche Schnittstellen für gemacht werden. Ich nehme an, sie teilen eine Reihe von Methoden, die Sie verwenden möchten.

Sie diese Methoden in einer Schnittstelle zu definieren,
dann haben Sie Ihre 20 Klassen implementieren diese Schnittstelle
dann myFunction nicht Object obj akzeptieren, aber interface obj und dann Methoden über die Schnittstellenfunktionen aufrufen.

interface IMyObject { 
    public String[] getStuff() { 
    } 
    public void doStuff() { 
    } 

} 

dann haben "Objekte" umzusetzen

class Foo implements IMyObject { 
    public String[] getStuff() { 
     return new String[10]; 
    } 
    public void doStuff() { 
     System.out.println("1+1 = 4"); 
    } 
} 
class Bar implements IMyObject { 
    public String[] getStuff() { 
     return new String[100]; 
    } 
    public void doStuff() { 
     System.out.println("5+1 = too hard"); 
    } 
} 
class Baz implements IMyObject { 
    public String[] getStuff() { 
     return new String[42]; 
    } 
    public void doStuff() { 
     System.out.println("1+1 = 2"); 
    } 
} 

dann Ihre myfunction die Schnittstelle akzeptieren

public void myFunction(IMyObject obj){ 
    obj.doStuff(); 
} 

Der "Vertrag" von IMyObject besagt, dass jede IMyObject die Methoden haben getStuff und doStuff, so können Sie diese immer aufrufen.

public void something() { 
    Bar myBar = new Bar(); 
    Baz myBaz = new Baz(); 
    myFunction(myBar); 
    myFunction(myBaz); 
} 
0

Da Ihre Felder privat sind, sollten Sie entweder getDelclaredFields oder getMethods und Filter nur Getter zu halten.

Beachten Sie, dass getDeclaredFields nur die Felder der obersten Klasse zurückgibt. Um vererbte Felder zu erhalten, müssen Sie mit getSuperclass() iterieren.