package .com;
/**
*
* @author ManagementAndJava
*
*/
/*
* 需求分析:
* 1.总结常用的Eclipse快捷键
* 2.了解类在运行是的信息
* 2.1了解类的加载过程
* 2.2了解 JVM中 方法区(和其中含有的常量池) 栈区 堆区
* 3.学习反射机制;
* 3.1类型信息
* 3.2反射原理
*
*
* 1.常用的Eclipse快捷键:
* Ctrl+1: 快速修复
* Ctrl+D: 快速删除行
* Shift+Enter: 快速开启下一行
* Alt+上下键:快速移动行
* Alt+Ctrl+上下键: 快速复制行
* Ctrl+M: 放大光标所在的工作区
* Alt+/: 补全代码:
* Ctrl+F11:快速运行项目
* 任意字母联想设置:
* 查看快捷键: window-->Preference-->General--->Editor---Key
*
*
* 2.了解JVM运行机制和类的运行时信息
* 2.1java内存分配分析:
* JVM是java程序与操作系统之间的桥梁,
* 一个完成的java程序运行时会涉及到以下内存区域:寄存器; 栈; 堆;方法区; 常量池;
* 1:栈:
* 保存局部变量的值:存放基本类型的变量数据,局部变量,和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)
* 或者常量池中(字符串常量对象存放在常量池中。)每个线程都有自己的栈区,数据都是私有的其他栈不能访问
* 2.堆:
* 用来存放动态产生的数据,比如new产生的对象,数组。注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法。
* 因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法,并不是每创建一个对象就把成员方
* 法复制一次;JVM只有一个堆区 被所有线程共享;
* 3.方法区:
* 用来存放已被加载的类的信息、常量、静态变量、即时编译器编译后的代码(在java中static的作用就是说明该变量,方法,代码块是属于
* 类的还是属于实例的)。又称为静态区,其和堆一样被所有线程共享;其存储的都是在整个线程中唯一的元素如 class 和static
* 4.常量池:
* JVM为每个已加载的类型维护一个常量池,常量池就是这个类型用到的常量的一个有序集合。包括直接常量(基本类型,String)和对其他类
* 型、方法、字段的符号引用(1)。池中的数据和数组一样通过索引访问。由于常量池包含了一个类型所有的对其他类型、方法、字段的符号
* 引用,所以常量池在Java的动态链接中起了核心作用。常量池存在于方法区(Method Area)内
* ( 1)、存放字符串常量和基本类型变量,比如String str=”www”; 实际上”www”是在常量池里边。
* (2)、常量池是在方法区中而不是堆内存中。
* (3)、 Java的8种基本类型(Byte, Short, Integer, Long, Character, Boolean, Float, Double), 除Float和Double以外, 其它六
* 种都实现了常量池, 但是它们只在大于等于-128并且小于等于127时才使用常量池。而如果大于127 或小于-128 则不会使用常量池
* 所以会直接在堆内存中创建对象。。
*
*
* 因为在java的八种基本类型: 基本类型(包装器类型) (普通变量(类))
* boolean (Boolean) char (Character) byte(Byte) short(Short) int(Integer) long(Long) float(Float) double(Double)
*
* */
//java常量池运用如下:
class ConstantPool{
/*
* 在jvm规范中,每个类型 都有自己的常量池。常量池是某类型所用常量的一个有序集合,包括直接常量(基本类型,String)和对其他类型、字段、
* 方法的符号引用。 之所以是符号引用而不是像c语言那样,编译时直接指定其他类型,是因为java是动态绑定的,只有在运行时根据某些规则才能
* 确定具体依赖的类型实例,这正是java实现多态的基础。
*/
//常量池中的对象和堆中的对象
public static void method(){
Integer i1 = new Integer(1);
Integer i2 = new Integer(1);
//i1和i2所对应的的对象分别位于 堆中 不同的内存空间
System.out.println(i1==i2);//输出结果为 false 因为 new在堆中 引用i1和i2是在栈中存放各自堆中不同的地址
int i3 =129;
int i4 = 129;
//变量的符号和数据都存放在栈中 并且只会在栈中存一份数据 i5=xxff102 i6=xxff102 同时指向129
System.out.println(i3==i4);//输出结果为true;因为是在栈中只创建了一个数据两个变量符号同一个地址;
/*
* java中基本类型的 包装类 的大部分都实现了常量池技术,这些类是Byte,Short,Integer,Long,Character,Boolean,
* 另外两种 浮点数类型(Float Double) 的包装类则没有实现。另外Byte,Short,Integer,Long,Character这5种整型
* 的包装类也只是在对应值-128-127时才可以使用常量池。
* */
//5种整形的包装类Byte,Short,Integer,Long,Character的对象,
//在值小于127时可以使用常量池
Integer i5=127;
Integer i6=127;
//i5和i6对对应的常量127存在常量池中,并且由于常量池中数据共享,所以在常量池中只会存在一个 127;而i5和i6这两个
//变量符号是在栈中保存的(i5=xxffo12,i6=xxff012),并且指向常量池中同一个地址;
System.out.println(i5==i6);//输出true
//值大于127时,不会从常量池中取对象
Integer i7=128;
Integer i8=128;
//在堆内存中分别建立两个 128 变量符号i7和i8分别保存在栈内存中,并且指向不同的地址;i7=xxf101 i8 =xxff451;
System.out.println("i7==i8"+(i7==i8));//输出false
//Boolean类也实现了常量池技术
Boolean b1=true;
Boolean b2=true;
System.out.println("b1==b2"+(b1==b2));//输出true
//浮点类型的包装类没有实现常量池技术 因此其数值保存在堆中 栈中存放对应堆中的地址;
Double d1=1.0;
Double d2=1.0;
System.out.println("d1==d2"+(d1==d2));//输出false
//String也实现了常量池技术,String类也是java中用得多的类,同样为了创建String对象的方便,也实现了常量池的技术
String s1 = "helloJava";
String s2 = "helloJava";
System.out.println("s1 == s2 "+(s1==s2));//输出结果:true
String s3 = new String("hellojava");
String s4 = new String("hellojava");
//属于new对象的 对象建立在堆中 引用变量存贮在栈中 ,并且栈中引用变量存的是两个对象的地址;
System.out.println("s3 == s4"+(s3=s4));//输出结果必然 为false;
String s5 = "hello";
String s6 = "Java";
//String s7= s5+s6;
System.out.println("s5+s6==s1"+((s5+s6)==s1));//输出结果为false;在运行时创建的字符串具有独立的内存地址,
//所以不引用自同一String对象
Integer in1=30;
Integer in2 =1;
Integer in3 =31;
System.out.println(in3==in2+in1);//输出结果为true;Java的数学计算是在内存栈里操作的其实比较的是
//基本类型(31=30+1),他们的值相同,因此结果为True。
}
}
class Person{//编译时其类型信息都会放入方法区
private String name;//运行时 new Person实例后 name 应有放在自己私有的栈中 ,name 对象放在堆区里
public Person(String name){
this.name =name;
}
public void eat(){//eat方法本身放入方法区中;
System.out.println("i can eat");
}
}
public class ReflectTest {
/*
* 系统收到开始命令后,启动JVM,这个进程首先从classpath路径中找到ReflectTest.class文件,读取这个文件中的二进制
* 数据,然后将运行时的ReflectTest类的类信息存放到方法区中;(上述过程也被成为类的加载过程),紧接着JVM会从方法区
* 中找打main()方法开始执行;
* */
public static void main(String[] args) {
Person p1 = new Person("Mike");
/*当JVM读到这句话时,首先回去方法区中找Person的信息,由于第一次加载发现没有,此时JVM会立即加载PersonL类,并且
* 把Person类的类型信息存放在方法区中,Java虚拟机首先就是在堆区中为一个新的Person实例分配内存, 这个Person实例
* 持有着指向方法区的Person类的类型信息的引用。实际上指的是Person类的类型信息在方法区中的内存地址, 而这个地址,
* 就存放了在Person实例的数据区里。
*
* 在虚拟机进程中,每个线程都会拥有一个方法调用栈,用来跟踪线程运行中一系列的方法调用过程,栈中的每一个元素就被
* 称为栈帧,每当线程调用一个方法的时候就会向方法栈压入一个新帧。这里的帧用来存储方法的参数、局部变量和运算过
* 中的临时数据。
*
* p1是一个在main()方法中定义的变量,可见,它是一个局部变量,因此,它被会添加到了执行main()方法的主线程的JAVA方
* 法调用栈中。而“=”将把这个p1变量指向堆区中的Person实例,也就是说,它持有了引用。
* */
p1.eat();
/*
* 接下来JVM执行P1.eat()方法时,JAVA虚拟机根据局部变量p1持有的引用,定位到堆区中的Person实例,再根据Person实例持有的引用,
* 定位到方法去中Person类的类型信息,从而获得eat()方法的字节码,接着执行eat()方法包含的指 令。
* */
}
}
相关推荐
「免费开源」从 OCR 识别到结构化输出:合同文本高效比对的完整解决方案!
本文将系统拆解这一解决方案的技术逻辑、实施步骤与落地价值,为企业合同管理数字化转型提供实操指南。字段提取:自动识别并提取预设的关键字段(如 “甲方”“乙方”“合同金额”“履约期限” 等),若遇到模糊表述(如 “付款时间为合同签订后 30 个工作日内”),系统可自动解析为 “履约期限:合同签订日 + 30 工作日”;预设结构化字段:根据合同类型(如采购合同、服务合同、租赁合同),定义需提取的关键字段(如 “甲方名称”“乙方名称”“合同金额”“有效期起 / 止日期”“履约地点”“违约金比例” 等);
JDK11 JAVA11下载安装与快速配置环境变量教程
1、到Oracle官网下载jdk11,并安装。搜索“jdk",选择"请到java官网下载jdk安装"进入。 点击"Accept License Agreement",然后在右下角选择合适自己的系统的JDK版本。大部分人选右下角的windows64位安装。 2、安装jdk11。 (安装过程相对于以前版本更简单,具体步骤见截图。) 点击jdk11安装包进行安装。 至此,安装完毕。...
一文详解心电图(ECG)监测原理
介绍心电图的监测原理,从心电信号产生、获取到心电图的基本组成
Java 反射的定义与作用(从0到1)适合初学者
Java反射机制允许程序在运行时动态获取类信息并操作对象成员。通过Class、Field、Method和Constructor等核心类,可以获取类结构、访问/修改字段值、调用方法及创建实例。主要方法包括getDeclaredFields()(获取所有字段)、invoke()(调用方法)和newInstance()(创建对象)等。反射支持动态加载类、绕过访问限制(需setAccessible(true)),广泛应用于框架开发(如Spring)、序列化工具等场景。虽然提供高度灵活性,但存在性能开销和破坏封装的风
从SolidWorks到URDF:插件使用、关节配置与PyBullet仿真避坑指南
本文提供了一份从SolidWorks导出URDF模型并导入PyBullet进行仿真的完整实战指南。详细讲解了SolidWorks插件的正确安装与配置、关节类型的选择与坐标系对齐的核心技巧,并针对PyBullet仿真中常见的模型散架、路径错误、物理属性异常等问题提供了深度避坑解决方案,帮助机器人开发者高效完成从设计到仿真的全流程。
Simulink中为Scope模块添加图例的方法
比如我要在Scope模块输出三轴加速度的数据,但三轴数据波形混杂在一起不太好看,此时就需要在Scope模块中添加图例来使波形看起来更加清晰明了。 注:我这里使用的Matlab版本为2019a 1.首先在simulink中打开,需要添加图例的Scope,如图示: 2.在Matlab,command窗口输入: >> set(0,'ShowHiddenHandles','On'); >> set(gcf,'menubar','figure'); 此时你会发现Scope窗口菜单栏多了好几
适合初学者的[JAVA]: 基础面试题
基础面试题
基于Ventoy制作单个U盘引导Windows+Linux+黑苹果macOS
一款国内高手开发的一个名为Ventoy的开源多系统启动U盘制作工具,官方链接:https://www.ventoy.net/cn/index.html Ventoy 特点 不影响U盘日常普通使用 直接从ISO文件启动,无需解开 支持MBR和GPT分区格式(1.0.15+) 支持超过4GB的ISO文件 支持大部分常见操作系统, 已测试650+ 个ISO文件 不仅仅是启动,而是完整的安装过程 版本升级时数据不会丢失 Ventoy 待改进 不支持macOS和ChromeOS 准备2个空的U.
03 - Java核心类库 — 枚举、注解与反射
目前阶段这块知识点了解即可,但在学习框架非常重要,能更好的理解框架。枚举能更好的管理一组相同的常量,内省是基于反射的基础,按照Java bean的标准延伸出来一套操作的API。 反射和内省,如果不进行框架开发,则很少使用;注解一般使用定义好的,自定义注解用的比较少。 枚举、注解与反射一、枚举1. 简介2. 定义格式2.1 Java1.5版本之前2.2 Java1.5版本之后3. 枚举类的主要方法3.1 归纳3.2 实例4. 实现接口的枚举类实例5. 枚举类的注意事项二、注解1. 简介2. 学习的重点.
RK3588设备树调试实战:解决NPU不加载、USB3.0识别异常与DP显示问题
本文深入探讨了RK3588设备树调试中的三大典型问题:NPU不加载、USB3.0识别异常与DP显示问题。通过详细的问题定位步骤、关键设备树修改和调试技巧,帮助开发者快速解决硬件适配中的挑战,提升RK3588平台的开发效率。
Midscene.js(2):代码集成 + 桥接模式(Bridge Mode)的使用「喂饭教程」
本文将手把手教你从零开始搭建一个 Node.js 项目,集成 Midscene.js,并利用其桥接模式实现对 Chrome 浏览器的自动化操作。我们将通过具体的实例,来展示 Midscene.js 的便捷性与 AI 能力的结合。
黑马程序员_Java基础_前期准备02-1
前期准备02-1 一、Java高新技术 ①MyEclipse ❶MyEclipse企业级工作平台(MyEclipse Enterprise Workbench,简称MyEclipse)是对EclipseIDE的扩展,使用它可以在数据库和JavaEE的开发、发布以及应用程序服务器的整合方面极大的提高工作效率。它是功能丰富的JavaEE集成开发环境,包括了完备的编码、调试、测试和发布功能,
Temporal Noise Reduction(TNR)时序去噪技术解析:原理、平台实践与工程调优路径
随着高画质夜景拍照和高清视频拍摄需求的持续增长,图像传感器在低照度环境下输出信号的噪声问题日益突出。相比空间域降噪(SNR),时序去噪(Temporal Noise Reduction, TNR)利用帧间信息进行融合处理,具备更高的信噪比提升效率及更强的边缘保护能力,已成为移动影像ISP链路中的核心环节。本文系统剖析TNR的算法原理、平台实现机制与工程调试路径,并基于实际开发案例分析其在不同场景下的效果差异及调优方法,为工程师提供从理论到实操的完整路径参考。
转(无法导入默认包)
假如有一个类,直接不加package,也就是属于默认包: view plaincopy to clipboardprint?public class ClassInDefaultPackage { public void doSomething(){ System.out.println("I am in default package."); ...
最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版
Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。
Outlook Express 6 (OE6) for Win7/Win8/Win10
英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。
从初学者到专家:Java反射的完整指南
反射是Java语言中的一项强大特性,它允许程序在运行时动态地获取、操作和修改类、对象、字段和方法的信息。通过反射,我们可以实现灵活的类实例化、字段访问和方法调用,以及处理注解和实现动态代理等功能。然而,反射的使用应谨慎,需要平衡灵活性、性能和安全性,并注意其局限性和注意事项。总而言之,反射为Java开发者提供了强大的工具,使得程序可以在运行时动态地适应不同的需求和场景。
LinePhone3.2.7(android端最新版本) sip客户端
SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/
初学java反射机制
回顾之前java程序如何创建类1.分析确定类名,属性名,方法.....创建类2.创建类的对象3.使用类一切都是已知的这种写发一般用于业务开发<servlet></servlet></select>框架需要只写一套程序,就可以处理我们给他的任意类,框架是如何做到写一套程序就可以处理任意类了?以前通过new对象,写方法的使用方式,可以看作是正向使用类.框架需要对任意类处理时,他只是知道类的名字,通过类的名字动态获得类中的信息.把这种对类的使用方式成为反向使用.
WINCC7.3破解文件
WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!
Java程序员都需要懂的「反射」,反射的都不懂,怎么学框架?
连反射都不懂,框架你怎么能学懂啊
初学——java反射
一、反射 1.什么是反射 反射是指在程序运行期间,能够观察和修改类或者类的对象的属性和行为的特性 2.为什么用反射 在java中有动态和静态的概念 静态是指在java中所有的类都编写好编译通过运行 动态是在在编写好类,编译运行中动态获取类的信息修改类的属性叫做反射. 例如:在已经运行的大项目中需要修改代码,如果项目处于运营,停止项目会带...
Java反射机制(适合初学者)
java反射机制(初学者福利)前言最近在学习Java的反射机制,看了很多网上的资料,感觉有点深,初学者理解起来有点困难,干脆把自己理解的写了些总结,希望能对初学反射机制的童鞋有些帮助,如果有不对的地方,还望各位侠士不吝指出.注:部分内容来源于网络一.什么是反射网络上的定义是:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和...
初学java之注解和反射篇
1 注解 1.1 什么是注解 Annotation是从JDK5.0开始引入的新技术 Annotation的作用: 不是程序本身,可以对程序作出解释。(这一点和注释(comment))没什么区别) 可以被其他程序(比如:编译器等)读取。 Annotation的格式: 注解是以”@注释名“在代码中存在的,还可以添加一些参数值,例如:@SuppressWarnings(value = “unchecked”). Annotation在哪里使用? 可以附加在package,class, method
java初学笔记10-反射
反射反射概述理解Class类并实例化Class类对象运行时创建类对象并获取类的完整结构通过反射调用类的指定方法、指定属性动态代理 反射概述 理解Class类并实例化Class类对象 运行时创建类对象并获取类的完整结构 通过反射调用类的指定方法、指定属性 动态代理 ...
JavaSE初学——简单介绍什么是反射,以及反射中最常见的基本用法
本篇文章主要针对反射中对于类的 (构造方法、成员方法、单个字段) 的 获取、调用 操作。
Java反射源码
反射 (Reflection) 是 Java 的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。简而言之,通过反射,我们可以在运行时获得程序或程序集中每一个类型的成员和成员的信息。程序中一般的对象的类型都是在编译期就确定下来的,而Java 反射机制可以动态地创建对象并调用其属性,这样的对象的类型在编译期是未知的。所以我们可以通过反射机制直接创建对象,即使这个对象的类型在编译期是未知的。
Java中反射的理解及如何使用——精简
反射是Java学习中重要的一部分内容,反射是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。
彻底理解Java反射以及动态代理中对反射的应用
反射 (Reflection) 是 Java 的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。 简而言之,通过反射,我们可以在运行时获得程序或程序集中每一个类型的成员和成员的信息。程序中一般的对象的类型都是在编译期就确定下来的,而 Java 反射机制可以动态地创建对象并调用其属性,这样的对象的类型在编译期是未知的。所以我们可以通过反射机制直接创建对象,即使...
JAVA反射调用详解
JAVA反射调用的确是一种很神奇的机制,在项目中使用后恋恋不忘,现将其好好整理一下。 参考: 学习JAVA应该如何理解反射?知乎 https://www.zhihu.com/question/24304289 全面细致讲解反射机制系列 http://www.365yg.com/item/6414118008049893889/?iid=9697930986&app=news_artic
835



被折叠的 条评论
为什么被折叠?



