这是我以前经历过的一个现实生活中的例子,这让我思考并质疑这个谜。
之前:我不知道如何使用类的名称动态地实例化一个类。
之后:我环顾别人的Java源代码,决定寻找与上述无关的内容,比如如何进行碰撞检测,只是偶然遇到一段代码我正确回答了如何动态实例化一个类的问题。
有问题的代码是:
A a = (A) Class.forName("A").newInstance();
其中A
是Java源文件的名称A.java
。
从这里开始,我不仅对此感兴趣,而且还开始怀疑,如果Java程序员只获得Java语言文档,他们将如何学习所有这些。
如果他们练习Java语言,他们如何知道在文档中查找的位置? 我知道新手Java程序员可以从专业的Java程序员那里获得一些经验,但是专家Java程序员在哪里学习所有这些,如果他们起初不知道在文档中找到了什么?< / p>
或者他们只是从第1页到文档末尾阅读,并尽可能密切关注,并从那里开始?这需要很长时间才能完成,这将是一个令人印象深刻的壮举。
答案 0 :(得分:1)
通常您搜索谷歌搜索Java文档...将您发送到包含它的Oracle网站。 http://docs.oracle.com/javase/7/docs/api/
在某些情况下,只需要API,但是当您需要一个完整的示例时,您可以搜索代码示例或代码片段,或者您想要解决的问题(即“java instantiate class dinamically”)。
关于动态实例化的问题,有许多可以完成的ClassLoader事情,但最基本的例子与你找到的类似......但是有一个问题。
当您在代码中引用A类时,jvm会自动为您加载它。 当你这样做
A a = (A)Class.forName("A").newInstance();
您将参考您已掌握的A类。
你可以做的是创建一个你要实例化的类必须实现的接口,如下所示:
String classPath = ...
AInterface a = (AInterface)Class.forName(classPath).newInstance();
你从那里使用它。
但是你必须记住添加try-catch块,因为newInstance方法只会在运行时尝试ti实例化时才知道引用的类是否有默认构造函数,如果没有,则会有例外。
同样适用于构造函数本身抛出的异常,它将被封装并抛回给你。