在运行时动态创建和转换对象

时间:2010-05-19 15:21:04

标签: java object runtime

假设我们有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对象。

3 个答案:

答案 0 :(得分:1)

班级Class有一个cast方法,乍一看似乎正在做你想要的。所以你可以试试

... = clazz.cast(obj);

但是什么是返回类型???它应该是AB,但您无法动态声明变量...

所以我认为除了丑陋,但尝试过的真实

之外别无他法
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的变量中。