java中每个用户定义的类都有一个与之关联的类Class对象吗?然后它与反射有何不同?

时间:2015-09-26 07:08:10

标签: java class jvm classloader

无法理解MyClass.class.getClassLoader()。这里的.class是什么?它是class类的参考吗?

那么使用反射获取ClassLoader信息有什么不同?

2 个答案:

答案 0 :(得分:2)

  

java中每个用户定义的类都有与之关联的Class对象吗?

是。并且每个系统也定义了类。 (虽然在尝试获取其引用之前,可能无法创建Class对象。)

  

无法理解MyClass.class.getClassLoader()。这里的.class是什么?它是班级的参考吗?

是。或者更准确地说,它是Class<MyClass>类型的引用。它指的是与该类型对应的一个(且唯一的)Class对象。

  

那么使用反射获取ClassLoader信息有什么不同?

之间有三个不同之处
    MyClass.class

   String someClassName = ...

   classloader.getClass(someClassName)

   Class.forName(someClassName)

在第一种情况下,类名硬连线到你的代码中,但表达式将始终工作 1 ,并且你得到的类对象的类型在编译时是{{{ 1}}。

在第二个和第三个(等效)情况下,类名可以是运行时变量,但表达式可能会失败(因为例如,命名类不存在),并且该类型仅在编译时被称为{ {1}}。

但是,假设事情有效,那么您获得的信息(即Class<MyClass>对象)在所有三种情况下都是相同的。

1 - 这可能是夸大其词。但是,您可能会看到异常的情况涉及处于错误状态的JVM。您可能需要看到非常糟糕的内容,例如从之前的Class<?>Class恢复。

答案 1 :(得分:1)

在类名后面写.class时,它引用代表给定类的Class对象。

例如,如果您的类是Foo,那么Foo.class是一个在运行时表示类Foo的对象。 它与Foo的任何(直接)实例的getClass()方法返回的对象相同。

ExceptionInInitializerError

我认为这里的关键是理解Class和Object之间的区别。 Object是Class的一个实例。但是在完全面向对象的语言中,Class也是一个Object。因此,调用.class可以获得对该Class的Class对象的引用,然后可以对其进行操作。