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

Java 在运行时动态创建和强制转换对象,java,object,runtime,Java,Object,Runtime,假设我们有两个A类和B类 public class A{ private int member1; A() { member1 = 10; } public getMember(){ return member1; } } 类B也在相同的行上,只是它的成员变量名为member2,并且在构造函数中初始化为20 我的要求: 在运行时,我得到一个包含类名的字符串(可以是a或B)。我希望在调用构造函数的同时动态创建此类的对

假设我们有两个A类和B类

public class A{

    private int member1;

    A() {
        member1 = 10;
    }

    public getMember(){
        return member1;
    }

}
类B也在相同的行上,只是它的成员变量名为member2,并且在构造函数中初始化为20

我的要求:

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

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

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

Class
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内省,您总是可以看到对象的实际动态类型和内部结构,因此我认为尝试获取正确类型的静态引用没有多大意义

我怎样才能做到这一点。我不想为上述类的公共功能使用接口


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

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

您好,我稍微编辑了您的问题,以便更好地格式化Java代码。据我所知,如果您选择StackOverflow代码并单击“10010001”图标,将所有代码向右移动(然后进行格式化),而不是使用xml
标记,则代码看起来会更好。您不能这样做,但可以使用第三个类,例如Common(类或Java接口)然后让A扩展公共和B扩展公共或A实现公共和B实现公共,并将公共功能放在“公共”类/接口中。从你的问题来看,似乎有一些共同的功能……我不想要一个接口,因为这里的类型t类在行为上与域类有很大的不同。以上只是一个示例功能,说明了我试图完成的任务,但并不代表代码的正确状态。现在怎么办?我的意思是动态地将该对象转换为T类型的对象。现在有什么建议吗?