Java 入门 八 (Java 反射)
有句话 叫做 无反射,无框架。觉得 十分正确。
浅谈反射
java在环境中 执行的是 该类的.class文件 jvm要先把 该类的类型信息 加载到 方法区中
当你 需要创建该类型的对象时 就根据该类型在方法区中的类型信息 也就是Class对象 创建出该类型的所有对象。
方法区
在一个jvm实例的内部,类型信息被存储在一个称为方法区的内存
逻辑区中。类型信息是由类加载器在类加载时从类文件中提取出来
的。类(静态)变量也存储在方法区中。
jvm实现的设计者决定了类型信息的内部表现形式。如,多字节变量
在类文件是以big-endian存储的,但在加载到方法区后,其存放
形式由jvm根据不同的平台来具体定义。
jvm在运行应用时要大量使用存储在方法区中的类型信息。在类型信息
的表示上,设计者除了要尽可能提高应用的运行效率外,还要考虑空间
问题。根据不同的需求,jvm的实现者可以在时间和空间上追求一种平
衡。
因为方法区是被所有线程共享的,所以必须考虑数据的线程安全。假如
两个线程都在试图找lava的类,在lava类还没有被加载的情况下,只
应该有一个线程去加载,而另一个线程等待。
方法区的大小不必是固定的,jvm可以根据应用的需要动态调整。同样
方法区也不必是连续的。方法区可以在堆(甚至是虚拟机自己的堆)中
分配。jvm可以允许用户和程序指定方法区的初始大小,最小和最大尺
寸。
方法区同样存在垃圾收集,因为通过用户定义的类加载器可以动态
扩展java程序,一些类也会成为垃圾。jvm可以回收一个未被引用
类所占的空间,以使方法区的空间最小。
类型信息
对每个加载的类型,jvm必须在方法区中存储以下类型信息:
一 这个类型的完整有效名
二 这个类型直接父类的完整有效名(除非这个类型是interface或是
java.lang.Object,两种情况下都没有父类)
三 这个类型的修饰符(public,abstract, final的某个子集)
四 这个类型直接接口的一个有序列表
类型名称在java类文件和jvm中都以完整有效名出现。在java
源代码中,完整有效名由类的所属包名称加一个".",再加上类名
组成。例如,类Object的所属包为java.lang,那它的完整
名称为java.lang.Object,但在类文件里,所有的"."都被
斜杠“/”代替,就成为java/lang/Object。完整有效名在
方法区中的表示根据不同的实现而不同。
除了以上的基本信息外,jvm还要为每个类型保存以下信息:
类型的常量池( constant pool)
域(Field)信息
方法(Method)信息
所有非常量的静态(static)变量
常量池
jvm为每个已加载的类型都维护一个常量池。常量池就是这个
类型用到的常量的一个有序集合,包括实际的常量(string,
integer, 和floating point常量)和对类型,域和方法
的符号引用。池中的数据项象数组项一样,是通过索引访问的。
因为常量池存储了一个类型所使用到的所有类型,域和方法的
符号引用,所以它在java程序的动态链接中起了核心的作用。
域信息
jvm必须在方法区中保存类型的所有域的相关信息以及域的声明顺序,
域的相关信息包括:
域名
域类型
域修饰符(public, private, protected,static,final
volatile, transient的某个子集)
方法信息
jvm必须保存所有方法的以下信息,同样域信息一样包括声明顺序
方法名
方法的返回类型(或 void)
方法参数的数量和类型(有序的)
方法的修饰符(public, private, protected, static, final,
synchronized, native, abstract的一个子集)
除了abstract和native方法外,其他方法还有保存
方法的字节码(bytecodes)
操作数栈和方法栈帧的局部变量区的大小
异常表
类变量(
Class Variables
译者:就是类的静态变量,它只与类相关,所以称为类变量
)
类变量被类的所有实例共享,即使没有类实例时你也可以访问它。
这些变量只与类相关,所以在方法区中,它们成为类数据在逻辑上
的一部分。在jvm使用一个类之前,它必须在方法区中为每个
non-final类变量分配空间。
常量(被声明为final的类变量)的处理方法则不同,每个常量都
会在常量池中有一个拷贝。non-final类变量被存储在声明它的
类信息内,而final类被存储在所有使用它的类信息内。
对类加载器的引用
jvm必须知道一个类型是由启动加载器加载的还是由用户类加载器加载的。
如果一个类型是由用户类加载器加载的,那么jvm会将这个类加载器的
一个引用作为类型信息的一部分保存在方法区中。
jvm在动态链接的时候需要这个信息。当解析一个类型到另一个类型的引用
的时候,jvm需要保证这两个类型的类加载器是相同的。这对jvm区分
名字空间的方式是至关重要的。
对Class类的引用
jvm为每个加载的类型(译者:包括类和接口)都创建一个
java.lang.Class的实例。而jvm必须以某种方式把
Class的这个实例和存储在方法区中的类型数据联系起来。
jvm总能根据 该类型在方法区中的类型信息 知道为该类型的对象 在堆内存中为它分配多少内存。
相关推荐
总的来说,"JAVA反射机制的入门代码"是初学者理解Java反射机制的好教材,通过它,你可以学习如何动态地操作Java类,提高代码的灵活性,并掌握处理`properties`文件的基础方法。在深入学习和实践中,你将进一步理解...
在这个“JDBC_Java反射技术入门”资源中,初学者可以了解到如何使用Java进行数据库操作的基础知识,包括连接数据库、执行SQL语句、处理查询结果等。 1. **JDBC基础**: - **加载驱动**:在使用JDBC之前,我们需要...
《Java入门到精通》是一本面向Java初学者的权威指南,旨在帮助读者快速掌握Java编程语言的基础知识并逐步深入到高级技术。这本书涵盖了从安装Java开发环境,理解基本语法,到构建复杂应用程序的全过程,是学习Java...
本资源“Java入门到精通完整教程+源码.zip”提供了一个全面的学习路径,帮助初学者逐步掌握Java编程技能并进阶至精通。下面将详细解析这个压缩包中的学习内容。 首先,"Java1908-master"可能指的是2019年8月的一个...
本资源“JAVA基础入门到精通pdf”提供了一条系统学习Java的路径,适合初学者作为入门教程。以下是对Java基础知识的详细解读: 1. **Java概述**:Java是由Sun Microsystems(现为Oracle公司)于1995年推出的一种面向...
"Java入门第三季学习笔记"可能涵盖了更多高级话题,如反射、注解、设计模式和Java库的使用。反射允许程序在运行时检查类、接口、字段和方法的信息,提供了更大的灵活性。注解是一种元数据,可以用来提供编译器或运行...
首先,Java入门阶段,你会了解到Java的历史、特点以及它与C++等其他语言的对比。Java以其“一次编写,到处运行”的跨平台特性,吸引了众多开发者。此外,还会介绍Java的开发环境搭建,包括JDK的安装和配置,以及集成...
以上只是Java入门的一些核心知识点,实际学习过程中,还会涉及到更多的高级主题,如反射、注解、设计模式、并发编程、JVM内存管理等。这个入门课件将逐步引导初学者掌握这些基础知识,为后续深入学习Java打下坚实的...
《Java入门123(二维码版)》是清华大学出版社于2015年出版的一本针对初学者的Java编程教程,结合了二维码技术,旨在提供更丰富的学习资源和互动体验。这本书涵盖了Java语言的基础知识,是Java编程学习的起点。 在...
推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 01.Java语言概述(共21页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 02.理解结构化程序设计_理解面向对象(共25页).ppt 推荐优质Java...
推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 01.Java语言概述(共21页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 02.理解结构化程序设计_理解面向对象(共25页).ppt 推荐优质Java...
Java反射是Java语言的一个重要特性,它允许程序在运行时检查和操作类、接口、对象等的内部结构。反射机制使得代码能够动态地获取类的信息并调用其方法,增加了程序的灵活性和可扩展性。以下将详细介绍Java反射中的几...
这份"java入门到精通PPT"提供了系统化的学习路径,旨在帮助初学者快速掌握Java核心技术,并逐步提升为专业人士。 首先,Java入门部分通常会涵盖以下几个核心概念: 1. **Java历史与特点**:讲解Java语言的起源、...
完整版 Java基础入门教程 Java程序语言设计 07 网络编程 反射机制(共23页).ppt 完整版 Java基础入门教程 Java程序语言设计 07 网络编程 网络编程(共32页).ppt 完整版 Java基础入门教程 Java程序语言设计 07 网络...
Java基础入门系列是帮助初学者掌握Java编程的重要学习材料,本篇主要介绍了泛型、反射和注解这三大高级特性。 泛型是Java SE 5版本引入的一个新特性,它的主要目的是允许在使用类、接口和方法时能够引用到任何类型...
Java标准库提供了丰富的API,书中的实例可能会覆盖IO流、网络编程、日期时间API、反射机制等主题。对于数据库操作,JDBC(Java Database Connectivity)是连接Java应用程序和数据库的标准接口,读者将学习如何使用它...
Java入门笔记文档详细阐述了Java编程语言的基本概念、开发工具、编程基础、面向对象编程、多线程、集合框架、IO流、网络编程、安全加密、反射机制、新特性、内存管理等多个方面,为初学者提供了一条通往Java编程世界...
Java SE编程入门教程 java反射机制(共16页).pptx Java SE编程入门教程 java泛型(共11页).pptx Java SE编程入门教程 java封装继承多态(共56页).pptx Java SE编程入门教程 java集合(共38页).pptx Java SE编程...
在“JAVA入门教程TXT”中,你将学习到以下基础知识: 1. **Java环境搭建**:首先,你需要安装Java Development Kit (JDK)。JDK包含了编译Java源代码所需的Java编译器(javac)、运行Java程序的Java虚拟机(JVM)...
本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)实验报告,基础篇有JAVA环境搭建、Java语言基础、方法和数组、面向对象基础、Java常用类、继承与接口、成员...本专栏主要为Java入门者提供实验参考。