使用.class对象有什么意义?

时间:2013-05-07 13:50:58

标签: java

在过去的几周里,我使用.class对象遇到了几个不同的人的代码。例如,ArrayList of classes : ArrayList<Class> but how to force those classes to extend some super class?

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

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

提前致谢。

5 个答案:

答案 0 :(得分:3)

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

例如,Spring framework使用包含Java类名称的配置文件。在该代码的某处,Spring需要构建这些类的对象实例。通过这种方式,可以在编译时不需要编译器知道有关Java类的任何内容的情况下创建对象。

答案 1 :(得分:3)

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

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

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

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

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

答案 2 :(得分:1)

这在开发在JVM上运行的脚本语言的解释器时非常有用,它可以调用Java方法。

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

答案 3 :(得分:1)

另一个用例:

InputStream is = MyClass.class.getResourceAsStream("/some/resource/in/the/jar");

答案 4 :(得分:1)

插件是一个很重要的用途。

动态加载.class文件,例如你的插件文件夹,并从所述文件执行一些指定的功能。然后,您可以同时为您的应用程序安装0个或更多插件及其任意组合。