使用属性文件创建未知类的新实例



所以我从老师那里得到了一个作业,用他的接口实现一个类。接口名称为Position。我设法写代码,它似乎工作得很好。

我们可以随意命名我们的实现类,但需要在属性文件("ewn.properties")中定义类名,关键字为"position-implementation",并将完全限定的类名作为值position-implementation = programmieren.aufgabe4.PositionImplementation。最后,我们必须将项目导出为jar(我的类+属性文件)。

到目前为止一切顺利。

现在我想测试我的解决方案。我创建了一个新项目、包和一个主类,并导入了两个jar(我的和我老师的)。

下面是测试类的代码:

public static void main(String[] args) {
    Properties prop = new Properties();
    InputStream in = Main.class.getResourceAsStream("/programmieren/aufgabe4/ewn.properties");
    try {
        prop.load(in);
        Class<?> clazz = (Class<?>) Class.forName(prop
                .getProperty("position-implementation"));
        System.out.println(clazz.toString());
        Position p = (Position) clazz.newInstance();
        p.toString();
    } catch (InstantiationException | IllegalAccessException
            | ClassNotFoundException | IOException e) {
        e.printStackTrace();
    }
}

我的问题是我不知道如何创建我的实现类的新实例。我试图使用接口作为声明类型,但我的对象调用后没有返回:

    p.toString();

但是它应该输出如下内容:

    ------------
    ------------
    ------------
    ------------
    ------------
    ------------

也是这一行:

    System.out.println(clazz.toString());

给出如下输出:class programmieren.aufgabe4.Position,但应该是class programmieren.aufgabe4.PositionImplementation,不是吗?

问题1:您只是执行方法调用而不打印

System.out.println(p.toString());

这将打印它

问题2:在下面的实现类中重写String toString()方法

programmieren.aufgabe4.PositionImplementation

@override
public String toString(){
return this.class.getName();
}

否则,它将调用属于任何更接近级别的超类的toString()方法。如果在继承树中没有找到toString()方法的任何重写,则将执行Object.toString()方法。因为所有实例的类型都是Object

最新更新