假设我们有2个A和B类
public class A{
private int member1;
A() {
member1 = 10;
}
public getMember(){
return member1;
}
}
B类也在同一行,除了它的成员变量名为member2并在构造函数中被初始化为20。
我的要求:
在运行时,我得到一个包含className的字符串(可以是A或B)。我想动态创建此类的对象以及调用构造函数。我怎样才能做到这一点。我不想使用接口来实现上述类的常用功能。稍后我会根据列列表使用Propery Builder Bean Util类设置此原始对象的属性。
Class clazz = Class.forName("className");
Obj obj = clazz.newInstance();
如何将该obj动态转换为className对象。
答案 0 :(得分:1)
班级Class
有一个cast
方法,乍一看似乎正在做你想要的。所以你可以试试
... = clazz.cast(obj);
但是什么是返回类型???它应该是A
或B
,但您无法动态声明变量...
所以我认为除了丑陋,但尝试过的真实
之外别无他法if (obj instanceof A) {
A a = (A) obj;
...
} else if (obj instanceof B) {
B b = (B) obj;
...
}
请注意,如果使用bean自省,您总是可以看到对象的实际动态类型和内部,因此我认为尝试获取正确类型的静态引用并没有多大意义。
答案 1 :(得分:1)
我怎样才能做到这一点。我不想将接口用于上述类的常用功能
然后答案很简单,你不会喜欢它:你不能。您希望修改变量的 static 类型,根据定义,在编译时确定。无法在运行时更改它。
答案 2 :(得分:1)
“动态转换”是什么意思?它是“className”类型的对象,存储在Object类型的变量中。如果要将它用作类型A的对象,则必须将其强制转换,例如将其存储在类型A的变量中。