【问题标题】:How to get a SubClass Instance, when i know the Class name as String in java?当我在java中知道类名为String时,如何获取子类实例?
【发布时间】:2011-08-31 05:05:11
【问题描述】:

我想在运行时创建 java 类的实例(它们都扩展了一个超类)。

这里有一些示例类:

class Super {
}

class FirstSub extends Super {
}

class SecondSub extends Super {
}

我知道类名是字符串:

String name = "SubClassName";

这是我的第一个方法:

Super foo;
if (FirstSub.class.getSimplename().equals(name)) {
    foo = new FirstSub();
}
if (SecondSub.class.getSimplename().equals(name)) {
    foo = new SecondSub();
}

如何以更复杂的方式获取“子类”之一的实例?

编辑:另外我想将foo 转换为SubClassName

【问题讨论】:

标签: java class polymorphism


【解决方案1】:
Class myClass = Class.forName(name);
Object o = myClass.newInstance();
Super instance = (Super)o;
//Subclass instance2 = (Subclass)o;

动态转换您的变量引用将是子类是不可能且不值得的。如果在这个地方你的对象可能是 FirstSub 或 SecondSub,那么这两个对象都应该提供一些给定的功能(方法)。您应该在超类中定义一些(例如抽象)方法(或使其成为接口)。那么,如果你有这样的行:

Super instance = (Super)o;

其中 o 是 Super 子类的实例,然后调用您的方法将调用子类上的方法。这就是多态的美

【讨论】:

  • Class class? class是java中受保护的关键字,这段代码不会编译
  • +1:注意:newInstance() 将抛出一个检查异常,就好像有未经检查的异常,这是令人惊讶的行为。你应该在它周围放置一个 try/catch(Exception) 块。
  • 如何将实例转换为SubClassName?使用此代码,类型始终为 Super
  • 这实际上是多态性。您应该在超类中的子类和接口(或只是其他方法)中覆盖方法。创建子类的具体实例后,您可以调用签名位于超类中的方法,然后调用子类方法
  • @Martin,Matthew 示例中的最后一行是对超类的强制转换。
【解决方案2】:
Super s = (Super) Class.forName(str).newInstance();

我想这会奏效。

【讨论】:

    【解决方案3】:

    这里是例子

    try{
       Class my_class = Class.forName(class_name);
       // use my_class object to
       Object initClassObj = my_class.newInstance();
    }catch(ClassNotFoundException ex){
       // handle exception
    }catch(Exception ex){
       // handle other exception 
    }
    

    【讨论】:

    • ;) 这对于标题是正确的(Class 的一个实例对于已知的类名),但看起来,问题是关于实例化
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多