Java反射

Java中的字节码:Java源代码经过虚拟机编译器编译后产生的文件(即扩展为.class的文件),它不面向任何特定的处理器,只面向虚拟机。

1.反射的定义

反射机制

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

什么是反射

反射就是把java类中的各种成分映射成一个个的Java对象

2.Class类

Class 类的实例表示正在运行的 Java 应用程序中的类和接口。也就是jvm中有N多的实例每个类都有该Class对象。(包括基本数据类型)
Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的defineClass 方法自动构造的。也就是这不需要我们自己去处理创建,JVM已经帮我们创建好了

(具体可查看源码,或查看Java api详解)

所有类型的Class对象

        Class c1 = Object.class;    //类Class c2 = Comparable.class;    //接口Class c3 = String.class;    //一维数组Class c4 = int[][].class;   //二维数组Class c5 = Override.class;  //注解Class c6 = ElementType.class;   //枚举Class c7 = Integer.class;   //基本数据类型Class c8 = void.class;  //voidClass c9 = Class.class; //Class//只要元素类型与维度一致,就是同一个Classint[] a = new int[10];int[] b = new int[100];int[][] c = new int[10][10];System.out.println(a.getClass().hashCode());System.out.println(b.getClass().hashCode());System.out.println(c.getClass().hashCode());

3.获取反射对象Class五种方式

  1. 通过Object类的方法getClass()继承给所有子类
  2. 任何数据类型都有静态的class属性
  3. 通过Class类的静态方法:forName(String className)
  4. 基本内置类型的包装类都有一个Type属性
  5. 通过子类Class找到父类Class

4.类的加载内存分析

加载

加载,是指Java虚拟机查找字节流(查找.class文件),并且根据字节流创建java.lang.Class对象的过程。这个过程,将类的.class文件中的二进制数据读入内存,放在运行时区域的方法区内。然后在堆中创建java.lang.Class对象,用来封装类在方法区的数据结构。

类加载阶段:

(1)Java虚拟机将.class文件读入内存,并为之创建一个Class对象。

(2)任何类被使用时系统都会为其创建一个且仅有一个Class对象。

(3)这个Class对象描述了这个类创建出来的对象的所有信息,比如有哪些构造方法,都有哪些成员方法,都有哪些成员变量等。

链接

链接包括验证、准备以及解析三个阶段。

(1)验证阶段。主要的目的是确保被加载的类(.class文件的字节流)满足Java虚拟机规范,不会造成安全错误。

(2)准备阶段。负责为类的静态成员分配内存,并设置默认初始值。

(3)解析阶段。将类的二进制数据中的符号引用替换为直接引用。

初始化

初始化,则是为标记为常量值的字段赋值的过程。换句话说,只对static修饰的变量或语句块进行初始化。

如果初始化一个类的时候,其父类尚未初始化,则优先初始化其父类。

如果同时包含多个静态变量和静态代码块,则按照自上而下的顺序依次执行。

具体说法如下:

执行类构造器<clinit>()方法的过程。类构造器<clinit>()方法是由编译期自动收集类中所有类变量的赋值动作和静态代码块中的语句合并产生的。(类构造器是构造类信息的,不是构造该类对象的构造器)。

当初始化一个类的时候,如果发现其父类还没有进行初始化,则需要先触发其父类的初始化虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确加锁和同步。

虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确加锁和同步。

    public class test03 {public static void main(String[] args) {A a = new A();System.out.println(a.m);}/*1.加载到内存,会产生一个类对应的Class对象2.链接,结束后 m = 0;3.初始化<clinit>() {System.out.println("A类静态代码块初始化");m = 300;m = 100;}m = 100;*/
}
class A {static {System.out.println("A类静态代码块初始化");m = 300;}static int m = 100;public A() {System.out.println("A类无参构造初始化");}
}

5.分析类初始化

类的主动引用(一定会发生初始化)

类的被动引用(不会发生类的初始化)

  • 当访问一个静态域时,只有真正声明这个域的类才会被初始化。如:当通过子类引用父类的静态变量,不会导致子类的初始化
  • 通过数组定义引用,不会出发此类的初始化
  • 引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中)
public class test04 {static {System.out.println("Main类被加载");}public static void main(String[] args) throws ClassNotFoundException {//1.主动引用Son son = new Son();//反射也会产生主动引用Class.forName("cn.com.reflection.Son");//不会产生类的引用的方法//子类引用父类的值System.out.println(Son.n);//数组只是开辟一个内存空间,也不会初始化Son[] a = new Son[5];//引用常量也不会初始化System.out.println(Son.M);}
}
class Father {static int n = 2;static {System.out.println("父类被加载");}
}
class Son extends Father {static {System.out.println("子类被加载");m = 300;}static int m = 100;static final int M = 1;
}

6.类加载器

类加载器作用是用来把类(class)装载进内存的。JVM规范定义了如下类型的类加载器。

系统类加载器

负责java-classpath或-d java.class.path所指的目录下的类与jar包装入工作库,是最常用的加载器。

扩展类加载器

负责jre/lib/ext或-d java.ext.dirs所指的目录下的类与jar包装入工作库

引导类加载器(根加载器)

用c++编写的,是jvm自带的类加载器,负责Java平台核心库,用来装载核心类库。该加载器无法直接获取。

各加载器关系

自定义加载器—>System Classloader—>Extension Classloader—>Bootstap Classloader(从左至右对应从底到顶)
自底向上检查类是否已装载
自顶向底尝试加载类

双亲委派机制

自顶向底尝试加载类时,会检查是否存在了该类的包,如果已存在就不会向下加载子类的包。
双亲委派机制保证了安全性。避免创建一些如Java核心类库中同样的命名。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/3558.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GitUI汉化

1.下载汉化文件 下载地址 备用下载地址 https://files.cnblogs.com/files/chenghu/git-gui-zh-master.zip https://files.cnblogs.com/files/chenghu/git-gui-zh-master.zip 2.找到git安装路径 C:\Program Files\Git\mingw64\share\git-gui\lib 3.解压出1下载的文件 复制粘…

VM(CentOS7安装和Linux连接工具以及换源)

目录 一、Linux意义 二、安装VMWare 三、centos7安装 1、正式安装CentOS7&#xff1a; 2、安装不了的解决方案 2.1常见问题——虚拟机开机就黑屏的完美解决办法 3、查看、设置IP地址 ① 查看ip地址&#xff1a;ip addr 或者 ifconfig&#xff0c; 注意与windows环境的区别…

了解区块链---一个去中心化技术

1.假如你是从事区块链的高端技术人员&#xff0c;我从来没有接触过区块链&#xff0c;请你为我讲解下他的概率、原理、应用&#xff1f; 概念&#xff1a; 区块链是一种去中心化的分布式账本技术&#xff0c;它是由一系列区块组成的链式结构&#xff0c;每个区块包含一些交易数…

宋浩线性代数笔记(一)行列式的计算

本帖更新b站宋浩老师的线代网课笔记&#xff0c;内容较为细致详细&#xff0c;参考书用的是科学出版社的第三版&#xff0c;之后会附加同济出版社第六版的教材内容。 &#xff08;字不好看大家将就看吧QAQ&#xff09;

当DevOps遇到AI,黑马迎来3.0时代丨IDCF

随着GhatGPT的爆火&#xff0c;人工智能和研发效能&#xff0c;无疑成为了2023的两个最重要的关键词。大规模语言模型LLM和相关应用的快速发展正在对研发团队的工作方式产生深远影响&#xff0c;这几乎象征着新的生产力革命的到来。 那么&#xff0c;作为一名工程师&#xff0…

java密码强度校验

一、代码 Testpublic void test(){//包含数字、大小写字母&#xff0c;长度10-20位 String regular "^(?.*\\d)(?.*[a-z])(?.*[A-Z]).{10,20}$";String example1 "1234567891";System.out.println(example1.matches(regular)); //falseString exa…

React(2)

题外话&#xff1a;vscode有个插件可以很方便的快速写代码 输入rcc回车 1.组件嵌套 import React, { Component } from reactclass Navbar extends Component{render(){return <div>Navbar</div>} }const Swiper()>{return <div>Swiper</div> }cons…

数据库信息速递 MONGODB 6.0 的新特性,更多的查询函数,加密查询,与时序数据集合 (译)...

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到3群&#xff08;共…

linux安装redis

背景 项目需要 安装redis&#xff0c;不使用root用户,假设使用redis用户。 root准备 安装依赖 yum install gcc安装目录 mkdir /usr/local/redis授权安装目录 注意&#xff0c;先要新建用户 chown -R redis:redis /usr/local/redis 安装 切换用户 下载 下载包地址 h…

Spring实现文件上传,文件上传

第一步&#xff1a;创建jsp文件 创建form表单 提交文件是post 文件上传的表单 服务端能不能获得数据&#xff0c;能 实现单文件上传的步骤&#xff1a; 导入相应的坐标&#xff1a;在pom.xml文件中进行导入 再导入这份&#xff1a; 第二步&#xff0c;在spring-MVC的上传中去配…

中文分词入门:使用IK分词器进行文本分词(附Java代码示例)

1. 介绍 中文分词是将连续的中文文本切分成一个个独立的词语的过程&#xff0c;是中文文本处理的基础。IK分词器是一个高效准确的中文分词工具&#xff0c;采用了"正向最大匹配"算法&#xff0c;并提供了丰富的功能和可定制选项。 2. IK分词器的特点 细粒度和颗粒…

Zookeeper简介及核心概念

一、Zookeeper简介 二、Zookeeper设计目标 三、核心概念 3.1 集群角色 3.2 会话 3.3 数据节点 3.4 节点信息 3.5 Watcher 3.6 ACL 四、ZAB协议 4.1 ZAB协议与数据一致性 4.2 ZAB协议的内容 五、Zookeeper的典型应用场景 5.1数据的发布/订阅 5.2 命名服务 5.3 Master选举 5.4 分…

2023云曦期末复现

目录 WEB sign SSTI serialize WEB sign 有10000个 进行bp爆破 能发现 410 和 414长度 还有 420 410 414存在16进制的字符 拼凑出来为 \x66\x6c\x61\x67\x7b\x61\x63\x63\x39\x39\x66\x39\x30\x34\x66\x30\x65\x61\x66\x61\x34\x31\x63\x30\x36\x34\x33\x36\x38\x31\x3…

一、对象的概念(3)

本章概要 单继承结构集合对象创建与生命周期异常处理其它 单继承结构 自从 C 引入以来&#xff0c;一个 OOP 问题变得尤为突出&#xff1a;是否所有的类都应该默认从一个基类继承呢&#xff1f;这个答案在 Java 中是肯定的&#xff08;实际上&#xff0c;除 C 以外的几乎所有…

JavaWeb_SpringCloud微服务_Day1-eureka, ribbon, nacos

JavaWeb_SpringCloud微服务_Day1-eureka, ribbon, nacos 认识微服务微服务技术对比 分布式服务架构案例远程调用 eureka注册中心原理搭建EurekaServer服务注册服务发现 Ribbon负载均衡修改负载均衡饥饿加载 nacos注册中心快速入门eureka和nacos对比 来源 认识微服务 微服务技术…

less 笔记

1 margin-left 之后有 margin: 0 导致margin-left 无效 --> 不能重复定义 .btn-group {margin-left: calc(100% - 350px);display: inline-block;margin: 0; // 重复定义 导致上面 没有效果padding: 0; } 2 一定要F12检查元素 看各个div的宽度是否太长 导致靠左靠右 计算不…

数据库锁机制

锁机制 1. 概述2. 并发事务的不同场景2.1 读-读情况2.2 写-写情况2.3 读-写或写-读情况2.3.1 方案一&#xff1a;读事务使用MVCC&#xff08;多版本并发控制&#xff09;&#xff0c;写事务加锁2.3.2 方案二&#xff1a;读、写事务均加锁 3. 锁分类3.1 从数据操作类型&#xff…

MySQL学习笔记

文章目录 1、登录2、查看数据库3、连接数据库4、查看表5、退出6、创建/删除数据库7、创建表8、数据类型9、查看表中的内容10、向表中插入数据11、约束主键&#xff1a;主键&#xff08;PRIMARY KEY&#xff09;作为数据表中一行数据的唯一标识符&#xff0c;在一张表中通过主键…

Go语言自定义包

在Go语言中&#xff0c;包&#xff08;package&#xff09;是一种重要的组织代码的方式。它可以将一组相关的函数、变量等封装在一个独立的单元中&#xff0c;便于代码的复用和维护。除了使用标准库中的包之外&#xff0c;我们还可以自己创建和使用自定义包。在本篇技术博客中&…

e2e测试框架之Cypress

谈起web自动化测试&#xff0c;大家首先想到的是Selenium&#xff01;随着近几年前端技术的发展&#xff0c;出现了不少前端测试框架&#xff0c;这些测试框架大多并不依赖于Selenium&#xff0c;这一点跟后端测试框架有很大不同&#xff0c;如Robot Framework做Web自动化测试本…