0

在过去的几周里,我遇到了几个使用 .class 对象的不同人的代码。例如,类的 ArrayList : ArrayList<Class> 但如何强制这些类扩展一些超类?.

我查了他们:http ://docs.oracle.com/javase/tutorial/reflect/class/index.html

我只是想知道您为什么要使用 .class 对象。我可以看到getDeclaredFields()getDeclaredMethods()可能有用,但我真的想不出具体的例子来说明为什么我实际上想要使用 .class 对象来代替其他东西。任何人都可以对这个话题有所了解吗?

提前致谢。

4

5 回答 5

3

反射是使用它的原因之一。另一个很好的例子是在运行时动态构造对象。

例如,Spring 框架使用包含 Java 类名称的配置文件。在该代码的某处,Spring 需要构建这些类的对象实例。通过这种方式,创建对象时编译器无需在编译时了解 Java 类的任何信息。

于 2013-05-07T13:57:36.530 回答
3

我认为你误解了这个概念。Classclass 与编译的类()无关.class

Class是一个表示 Java 类内部结构的类,例如字段、方法等。这是一个编译时实体,您可以在代码中使用它(甚至在编译之前)。

.class是一个编译好的Java类文件,是Java字节码。这不是一个“代码”实体(您不能将它用作代码中的类或对象 - 除了作为任何文件 - )并且在编译之前它不可用。

当您想对代码进行高级操作时,反射(Class是反射包的一部分)很有用,比如操作它、访问它的成员、从中获取信息等等......

要使用反射的一个典型示例是制作 Java 调试器。由于任何代码都可以在调试器上运行,因此您需要反射来获取有关对象实例及其结构的信息并将其显示给用户。

于 2013-05-07T14:02:21.003 回答
1

另一个用例:

InputStream is = MyClass.class.getResourceAsStream("/some/resource/in/the/jar");
于 2013-05-07T14:14:06.753 回答
1

这在开发运行在 JVM 上的脚本语言的解释器时很有用,它能够调用 Java 方法。

此外,在允许插件扩展的系统中可能很有用。

于 2013-05-07T13:55:23.337 回答
1

插件对此有很大的用处。

动态加载位于插件文件夹中的 .class 文件,并从所述文件中执行一些指定的功能。然后,您可以一次为您的应用程序安装 0 个或多个插件以及它们的任意组合。

于 2013-05-07T14:15:08.813 回答