Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java将对象动态转换为实体_Java_Casting - Fatal编程技术网

Java将对象动态转换为实体

Java将对象动态转换为实体,java,casting,Java,Casting,我创建了一个需要Object类型参数的函数 public void myFunction(Object obj){ } 现在我有20个不同的实体,所以给定的对象参数可以是这20个实体的类型。 我正在寻找一种方法,将这个对象转换为正确的实体类型,并获取它的所有值 现在我用这个得到了正确的类型,但我不知道如何将它转换为这个类型,字段总是0 System.out.println("Class: " + obj.getClass());//Gives me the right type System

我创建了一个需要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

您可以按如下方式使用反射:

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));
    }
}
假设您有一个如下所示的数据类:

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

您可以这样尝试,使用反射检索每个实体对象的声明字段:

 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));
    }
}
测试模型。B类:

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

不是你问的答案,但我认为你在寻找: 您描述的用例就是接口的用途。 我认为他们有一套你希望使用的方法

您可以在接口中定义这些方法,
然后让您的20个类实现该接口
然后让myFunction接受的不是对象对象对象,而是接口对象 然后通过接口函数调用方法

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

因为字段是私有的,所以应该使用getDelclaredFields,或者使用getMethods和filter只保留getter


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

您的意思是
强制转换
。字段是公共的吗?字段是getter/Setter的私有字段。您应该使用getDelclaredFields或getMethods和filter仅保留getter我也有此解决方案,但正在搜索动态的内容。所以我需要为我所有的20个函数创建一个if/else if构造Entities@TheNewby也许Java泛型就是您想要的?非常感谢!这就是我要找的
public void something() {
   Bar myBar = new Bar();
   Baz myBaz = new Baz();
   myFunction(myBar);
   myFunction(myBaz);
}