无法理解MyClass.class.getClassLoader()
。这里的.class
是什么?它是class
类的参考吗?
那么使用反射获取ClassLoader
信息有什么不同?
答案 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对象的引用,然后可以对其进行操作。