2

这是我以前经历过的一个真实的例子,这让我思考和质疑这个谜团。

之前:我不知道如何仅通过使用类的名称来动态实例化一个类。

之后:我查看了别人的 Java 源代码,决心寻找与上述无关的东西,比如如何进行碰撞检测,只是偶然发现了一段代码,它正确回答了我关于如何实例化一个类的问题动态的。

有问题的代码是这样的:

A a = (A) Class.forName("A").newInstance();

AJava 源文件的名称在哪里, A.java.

从这里开始,我不仅对它感兴趣,而且开始怀疑,如果只给 Java 语言文档,Java 程序员如何学习所有这些。

如果他们正在练习 Java 语言,他们如何知道在文档中的何处查找?我知道新手 Java 程序员从专家 Java 程序员那里获得一些经验,但是如果专家 Java 程序员一开始不知道在哪里寻找文档,他们从哪里学到所有这些

还是他们只是从第 1 页阅读到文档的末尾,并尽可能地紧跟其后,然后从那里开始?这将需要很长时间才能完成,这将是一项令人印象深刻的壮举。

4

1 回答 1

1

通常你在谷歌上搜索 Java 文档……它们会将你发送到包含它的 Oracle 网站。http://docs.oracle.com/javase/7/docs/api/

在某些情况下,只有 API 是必需的,但是当您需要完整的示例时,您可以搜索代码示例或片段,或者您想要自行解决的问题(即“java 实例化类”)。

在动态实例化的问题上,可以做很多 ClassLoader 的事情,但最基本的例子与你找到的类似......但有一个问题。

当您在代码中引用 A 类时,jvm 会自动为您加载它。当你这样做

A a = (A)Class.forName("A").newInstance();

您将参考您已经掌握的 A 类。

您可以做的是创建一个您要实例化的类必须实现的接口,如下所示:

String classPath = ...
AInterface a = (AInterface)Class.forName(classPath).newInstance();

你从那里使用它。

但是你必须记住添加 try-catch 块,因为 newInstance 方法只会在运行时尝试实例化它时知道被引用的类是否有默认构造函数,如果没有就会有异常。

构造函数本身抛出的异常也是如此,它将被封装并返回给你。

于 2012-08-18T18:11:09.903 回答