我读过很多关于类加载器和类的论坛,这可能是我犯的错误。我现在很困惑。
ClassLoader 什么时候被实例化?
读到“当一个java源文件被编译成一个二进制类时,编译器会在java类文件中插入一个字段。它是一个
public
static
final
名为'class'的字段类型java.lang.Class
的字段”。这是真的?那为什么不用编译就可以直接在代码中访问 .class 呢?
任何其他有效信息可以帮助更好地理解这一点?
我读过很多关于类加载器和类的论坛,这可能是我犯的错误。我现在很困惑。
ClassLoader 什么时候被实例化?
读到“当一个java源文件被编译成一个二进制类时,编译器会在java类文件中插入一个字段。它是一个public
static
final
名为'class'的字段类型java.lang.Class
的字段”。这是真的?那为什么不用编译就可以直接在代码中访问 .class 呢?
任何其他有效信息可以帮助更好地理解这一点?
ClassLoader
是你的类的容器。因此,您需要在需要加载类时手动创建它,或者 JVM 在启动时自动创建它以加载您的应用程序。有一个类加载器的层次结构,所以它有点复杂,你引用的文章很好地涵盖了这个主题。
恐怕不是。我认为作者的意思是它可以被看作是一个静态字段被注入到一个类中——这真的很有意义。我刚刚反编译了一个类:
public class Role {
public String role;
}
并且它在字节或以下内容中都没有该字段的痕迹:
public class bear.core.Role {
public java.lang.String role;
public bear.core.Role();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
}
对于您的最后一个问题 - 现代 IDE 只知道有这个.class
字段。
When does ClassLoader get instantiated?
类加载器在编译后由 JVM 加载类文件时被实例化,然后再链接!