2016-12-01 42 views
2

我創建了一個需要Object類型的Parameter的函數。Java將對象動態轉換爲實體

public void myFunction(Object obj){ 

} 

現在我有20個不同的實體,所以給定的對象參數可以是這20個實體的類型。 我正在尋找一種方法來在正確的實體類型中投射這個對象並獲取它的所有值。

現在我得到正確的類型的,但我不知道如何將它轉換爲這種類型和領域始終爲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

你的意思是'鑄造'。 – xenteros

+0

這些字段是公開的嗎? –

+0

字段是私有的getter/setter – TheNewby

回答

1

你可以嘗試這樣的,使用反射來檢索每個實體對象聲明的字段:

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)); 
    } 
} 

測試模型。 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; 
    } 

} 

測試模型。 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; 
    } 

} 

和輸出:

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

非常感謝!這就是我一直在尋找的 – TheNewby

0
public void myFunction(Object obj) { 

    if (obj instanceof MyEntity) { 

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

我也有這個解決方案,但是搜索動態的東西。所以我需要爲所有20個實體創建一個if/else if結構 – TheNewby

+1

@TheNewby也許Java泛型是您正在尋找的東西? – Hexaholic

0

您可以使用反射如下:

假設你有一個像下面這樣的數據類:

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 
    } 
} 

你可以寫使用反射的方法如下:

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

不是真正的答案你問,但我認爲你正在尋找: 您所描述的用例是什麼什麼接口的製作。 我假設他們分享了一套您想要使用的方法。

你定義一個接口這些方法,
然後讓你的20類實現該接口
然後讓myFunction的授受不Object obj,但interface obj ,然後通過接口函數調用你的方法。

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

} 

然後讓你的 「對象」 實現它

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"); 
    } 
} 

然後讓你的MyFunction的接受接口

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

「合同」 的IMyObject規定,每個IMyObject將有方法getStuff和doStuff,所以你可以隨時調用這些。

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

因爲,你的領域是私人的,你還是使用getDelclaredFields,或和的getMethods過濾器,只保留干將。

請注意,getDeclaredFields只返回頂級類的字段。要獲得繼承的字段,您必須使用getSuperclass()進行迭代。