在过去的几周里,我使用.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对象来代替其他东西。有人能说清楚这个话题吗?
提前致谢。
答案 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个或更多插件及其任意组合。