2016-12-01 87 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()进行迭代。