Java将对象动态转换为实体

时间:2016-12-01 13:53:53

标签: java casting

我创建了一个需要Object类型参数的函数。

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

5 个答案:

答案 0 :(得分:1)

您可以尝试使用反射来检索每个Entity对象的声明字段:

 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

答案 1 :(得分:0)

public void myFunction(Object obj) {

    if (obj instanceof MyEntity) {

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

答案 2 :(得分: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));
    }
}

答案 3 :(得分:0)

不是你问的答案,但我认为你在寻找: 您描述的用例是什么接口。 我假设他们分享了一组你想要使用的方法。

您可以在界面中定义这些方法,
然后让你的20个类实现该接口
然后让你的myFunction不接受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");
    }
}

然后有你的&#34;对象&#34;实施它

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

然后让你的myfunction接受界面

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

&#34;合同&#34; IMyObject声明每个IMyObject都有方法getStuff和doStuff,所以你总是可以调用它们。

adb shell dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp'

答案 4 :(得分:0)

由于你的字段是私有的,你应该使用getDelclaredFields,或者getMethods和filter来保留getter。

请注意,getDeclaredFields仅返回顶级类的字段。要获取继承的字段,必须使用getSuperclass()进行迭代。