Java将对象动态转换为实体
我创建了一个需要Object类型参数的函数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
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);
}