pai*_*msn 0 java reflection jvm
我知道反射是一种在不知道具体类型的情况下调用方法或操作字节码的技术。
最近在研究类加载器的时候,看到一篇文章,说反射是让类加载器动态加载类,做类型检查。这是真的?
原文不是英文,所以翻译可能有点奇怪。
Java 动态加载类。也就是说,所有代码都在运行时链接到 JVM。每个类都动态链接到 JVM 并在引用该类时加载到内存中。Java 的运行时库(【JDK 安装目录】/jre/lib/rt.jar)也不例外。这种动态的类加载是通过Java的类加载器系统完成的,Java提供的类加载器通过java.lang.ClassLoader来表示。当 JVM 启动时,它会创建一个引导类加载器,然后将第一个类 Object 读入系统。
在运行时动态加载一个类意味着 JVM 没有关于该类的信息。换句话说,JVM 不知道有关方法、字段和类的继承关系的信息。因此,类加载器应该能够在加载类时获取必要的信息并检查类是否正确。如果您不能这样做,则 JVM 可能具有不匹配的 .class 文件版本,并且将无法进行类型检查。JVM 具有内部分析类的能力,从 JDK 1.1 开始,开发人员可以通过反射来分析这些类。
反射具体是指Java 代码检查已加载的 Java 类并与它们动态交互的能力(即,不仅仅是调用方法或访问编译时已知的字段)。
JVM 在加载类时所做的事情是相似的,因为它检查字节码以了解组成类的部分并检查正确性,但它不是上面写的意义上的反射:它不使用相同的 API ,因为它们仅限于更高层次的视图。实际上,Java 中的反射 API 仅在 JVM 完全分析并“理解”类后才发挥作用。
请注意,类加载器本身实际上并不需要理解类:它只向 JVM 提供原始字节码来加载它们。它所要做的就是找到该字节码并将其加载到内存中。
这段引用的文本中没有任何内容可以得出反射是“用于类加载器”的结论。
文本以“……从 JDK 1.1 开始,开发人员可以通过反射来分析这些类”,这是一个代表自身的附加信息。文本之前讨论过类加载器的事实与此处无关。
当它归结为“几乎从一开始”时提到版本号,表明这是一个相当古老的文本。这解释了部分
因此,类加载器应该能够在加载类时获取必要的信息并检查类是否正确。
类加载器根本不这样做。但是在 Java 1.0 和部分 Java 1.1 中,类加载器确实被认为负责链接和验证任务。这已被 JDK 1.2(也称为 Java 2)清除。从那时起,类加载器的职责仅限于定位必要的资源并将其加载到字节数组中,然后传递给 JVM。链接和验证是 JVM 的工作,这意味着它还将保护自己免受可能损坏的类加载器的影响。
由于类加载器的工作只是将文件、套接字或其他资源读入字节数组并将它们传递给 JVM,因此它们自己不需要反射 API。
| 归档时间: |
|
| 查看次数: |
68 次 |
| 最近记录: |