【问题标题】:Dynamically create and cast objects at runtime在运行时动态创建和转换对象
【发布时间】:2011-02-21 10:50:30
【问题描述】:

假设我们有 2 个类 A 和 B

public class A{

    private int member1;

    A() {
        member1 = 10;
    }

    public getMember(){
        return member1;
    }

}

除了它的成员变量被命名为 member2 并且在构造函数中被初始化为 20 之外,B 类也在同一行中。

我的要求:

在运行时,我得到一个包含类名(可以是 A 或 B)的字符串。我想在调用构造函数的同时动态创建这个类的一个对象。我怎样才能做到这一点。我不想将接口用于上述类的通用功能此外,稍后我使用基于列列表的 Propery Builder Bean Util 类设置此原始对象的属性。

Class clazz = Class.forName("className");
Obj obj = clazz.newInstance();

如何将该 obj 动态转换为 className 对象。

【问题讨论】:

  • 您好,我稍微编辑了您的问题以更好地格式化您的 Java 代码。据我所知,如果您选择 StackOverflow 代码并单击“10010001”图标,将所有代码向右移动(然后格式化)而不是使用 xml 标记,它看起来会更好。
  • 你不能这样做,但你可以有第三个类,比如 Common(类或 Java 接口),然后有 A extends Common 和 B 扩展 CommonA 实现 CommonB 实现 Common 并将通用功能放在“Common”类/接口中。从您的问题来看,似乎有共享的通用功能......
  • 我不想要一个接口,因为这里的 Type T 类在其行为上的领域分类有很大不同。以上只是一个示例功能,可让您了解我要完成的工作,并不代表我的代码的正确状态。现在呢?

标签: java object runtime


【解决方案1】:

我怎样才能做到这一点。我不想将接口用于上述类的通用功能

那么答案很简单,你不会喜欢它:你不能。您想修改变量的 static 类型,根据定义,该类型是在编译时确定的。无法在运行时更改它。

【讨论】:

    【解决方案2】:

    “动态转换”是什么意思?它是“className”类型的对象,存储在 Object 类型的变量中。如果要将其用作 A 类型的对象,则必须对其进行强制转换,例如将其存储在 A 类型的变量中。

    【讨论】:

    • 我的意思是将该对象动态转换为 T 类型的对象。现在有什么指针吗?
    【解决方案3】:

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

    ... = clazz.cast(obj);
    

    但是返回类型是什么???应该是AB,但不能动态声明变量...

    所以我认为除了丑陋之外别无他法,但尝试过且真实

    if (obj instanceof A) {
      A a = (A) obj;
      ...
    } else if (obj instanceof B) {
      B b = (B) obj;
      ...
    }
    

    请注意,如果使用 bean 自省,您始终可以看到对象的实际动态类型和内部结构,因此我认为尝试获取正确类型的静态引用并没有多大意义。

    【讨论】:

      猜你喜欢
      • 2020-04-12
      • 1970-01-01
      • 2017-12-28
      • 1970-01-01
      • 2019-04-11
      • 1970-01-01
      • 1970-01-01
      • 2013-05-06
      • 2017-08-21
      相关资源
      最近更新 更多