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

Java 使用属性文件创建未知类的新实例,java,instantiation,properties-file,Java,Instantiation,Properties File,所以我从老师那里得到了一份作业,用他的接口实现了一个类。 接口的名称为“位置”。我成功地编写了代码,它似乎工作得很好 我们可以随意命名实现类,但需要在属性文件(“ewn.properties”)中定义类名,其中键“position implementation”和完全限定的类名作为值 position implementation=programmieren.aufgabe4.position implementation。 最后,我们必须将项目导出为jar(我的类+属性文件) 到目前为止还不错

所以我从老师那里得到了一份作业,用他的接口实现了一个类。 接口的名称为“位置”。我成功地编写了代码,它似乎工作得很好

我们可以随意命名实现类,但需要在属性文件(“ewn.properties”)中定义类名,其中键“position implementation”和完全限定的类名作为值
position implementation=programmieren.aufgabe4.position implementation
。 最后,我们必须将项目导出为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();
    }
}
但它应该打印如下内容:

    ------------
    ------------
    ------------
    ------------
    ------------
    ------------
此外,这一行:

    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

,因此不打印将返回字符串变量的p.toString(),System.out.println(p.toString())也是如此;我确实重写了
programmieren.aufgabe4.PositionImplementation中的
toString()
方法(编辑:哦,天哪!多愚蠢的错误…非常感谢!但不应该
System.out.println(clazz.toString)
返回我的实现的类名?你确定创建的对象的类型是
位置实现
?你能再次检查它吗?是的,现在它打印出所需的结果:)。很高兴它有帮助。你能接受并关闭问题吗:)
@override
public String toString(){
return this.class.getName();
}