首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在反编译的构造函数字节码中会有"this“的局部变量声明?

在反编译的构造函数字节码中会有"this"的局部变量声明,是因为在Java字节码中,构造函数是用特殊的方法名"<init>"表示的。在构造函数中,this关键字表示当前对象的引用,用于访问当前对象的成员变量和方法。

在字节码中,构造函数的第一个指令通常是aload_0,将当前对象的引用加载到操作数栈上。为了在构造函数中使用this关键字,字节码需要声明一个局部变量来存储当前对象的引用。这个局部变量的名称通常是this,并且在字节码中会通过astore指令将当前对象的引用存储到这个局部变量中。

这样做的目的是为了在构造函数中能够方便地访问当前对象的成员变量和方法。通过this关键字,可以明确指定当前对象的成员变量和方法,避免与其他变量或方法产生命名冲突。

总结起来,反编译的构造函数字节码中会有"this"的局部变量声明是为了在构造函数中方便地访问当前对象的成员变量和方法。这是Java字节码的规范要求,以确保构造函数的正常运行。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云函数(云原生、无服务器计算):https://cloud.tencent.com/product/scf
  • 腾讯云数据库(数据库):https://cloud.tencent.com/product/cdb
  • 腾讯云CDN(内容分发网络):https://cloud.tencent.com/product/cdn
  • 腾讯云安全加速(网络安全):https://cloud.tencent.com/product/ddos
  • 腾讯云音视频处理(音视频):https://cloud.tencent.com/product/mps
  • 腾讯云人工智能(人工智能):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(物联网):https://cloud.tencent.com/product/iotexplorer
  • 腾讯云移动开发(移动开发):https://cloud.tencent.com/product/mobdev
  • 腾讯云对象存储(存储):https://cloud.tencent.com/product/cos
  • 腾讯云区块链(区块链):https://cloud.tencent.com/product/baas
  • 腾讯云虚拟专用网络(网络通信):https://cloud.tencent.com/product/vpc
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

js构造函数和普通函数区别_函数声明函数定义

大家好,又见面了,我是你们朋友全栈君。 1、构造函数也是一个普通函数,创建方式和普通函数一样,但构造函数习惯上首字母大写 2、构造函数和普通函数区别在于:调用方式不一样。...普通函数调用方式:直接调用 person(); b.构造函数调用方式:需要使用new关键字来调用 new Person(); 4、构造函数函数名与类名相同:Person( ) 这个构造函数...A、立刻在堆内存创建一个新对象 B、将新建对象设置为函数this C、逐个执行函数代码 D、将新建对象作为返回值 6、普通函数例子...:因为没有返回值,所以为undefined 7、构造函数例子:构造函数会马上创建一个新对象,并将该新对象作为返回值返回 8、用instanceof 可以检查一个对象是否是一个类实例...,是则返回true; 所有对象都是Object对象后代,所以任何对象和Object做instanceof都会返回true 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。

3.1K10

函数局部程序(像是比局部变量还局部部分)

我们都知道局部变量一个函数内部定义变量,它只函数范围内有效,也就是说只有函数内才能使用它们,在此函数以外是不能使用这些变量。...一个函数内部定义变量只函数范围内有效,也就是只有本函数内才能引用它们,在此函数外不能使用这些变量。...复合语句内定义变量只能在本复合语句范围内有效,只有本复合语句内才能引用他们,该复合语句外不能使用这些变量。还有就是函数形参,只函数内有效。...而全局变量有效范围为从定义变量位置开始到本源文件结束。 但还有一种形式局部变量不是以函数为限制,而是以括号为限制,局部代码。 {}代码,输入局部变量括号外面不能调用。...实例: #include int main() { int a=5; //{}代码,输入局部变量括号外面不能调用 { int a=1; printf("%d\n"

1K20

一文搞定JVM字节

为什么jvm不能直接运行java代码呢,这是因为cpu层面看来计算机中所有的操作都是一个个指令运行汇集而成,java是高级语言,只有人类才能理解其逻辑,计算机是无法识别的,所以java代码必须要先编译成字节文件...image.png Java字节文件 class文件本质上是一个以8位字节为基础单位二进制流,各个数据项目严格按照顺序紧凑排列class文件。...[][]类型维数组,将被记录为[[Ljava/lang/String; # 方法表集合 常量池之后是对类内部方法描述,字节以表集合形式表现,暂且不管字节文件16进制文件内容如何,我们直接看反编译内容...字节4,5,以及13,14执行是同一个操作,就是将int型3入操作数栈顶,并存入第二个局部变量。...如果我们扩展函数为Any?.sayHello(),那么在编译后文件则不会有这段字节出现。

13010

无处不在字节技术-ASMcglib和fastjson应用

字节技术我们常见各大框架中都有用到. 这篇文章我们将讲解 ASM cglib 和 fastjson 上实际使用案例。...cglib 简单应用 如果说 ASM 是字节改写事实上标准,那么可以说 cglib 则是动态代理事实上标准。...Guice、EasyMock、jMock 等 实现内部,cglib 库使用了 ASM 字节操作框架来转化字节,产生新类,帮助开发者屏蔽了很多字节相关内部细节,不用再去关心类文件格式、指令集等...那么 fastjson 是怎么解决反射低效问题呢?通过调试方式,把 fastjson 生成字节写入到文件。...小结 这篇文章我们主要讲解了 ASM 字节改写技术 cglib 和 fastjson 上应用,一起来回顾一下要点: 第一,cglib 使用 ASM 生成了目标代理类一个子类,子类扩展父类方法

21120

难顶,学不动了!

组合起来意思就是,声明了一个类型为 int 字段 age。 ---- 04、字段表集合 字段表用来描述接口或者类声明变量,包括类变量和成员变量,但不包含声明方法中局部变量。... Main.class 字节文件,字段表信息如下所示。...locals 为局部变量所需要存储空间,单位为槽(slot),方法参数变量和方法内局部变量都会存储局部变量。 args_size 为方法参数个数。...为什么 stack 值为 2,locals 值为 1,args_size 值为 1 呢?默认构造方法不是没有参数和局部变量吗?...1,方法参数个数为 1,是因为局部变量只有一个隐藏 this,并且字节指令只执行了一次 aload_0。

52020

构造函数以及析构函数PHP需要注意地方

构造函数以及析构函数PHP需要注意地方 基本上所有的编程语言类中都会有构造函数和析构函数概念。...构造函数函数实例创建时可以用来做一些初始化工作,而析构函数则可以实例销毁前做一些清理工作。...,则默认调用父类 析构函数如果没显式地将变量置为NULL或者使用unset()的话,会在脚本执行完成后进行调用,调用顺序测试代码是类似于栈形式先进后出(C->B->A,C先被析构),但在服务器环境则不一定...构造函数和析构函数访问限制 构造函数和析构函数默认都是public,和类其他方法默认值一样。当然它们也可以设置成private和protected。...关于单例模式为什么要让外部无法实例化问题,我们可以看看之前设计模式系统文章单例模式。

1.6K20

java编程代码都是背下来吗_向学弟学妹们介绍自己大学

组合起来意思就是,声明了一个类型为 int 字段 age。 ---- 04、字段表集合 字段表用来描述接口或者类声明变量,包括类变量和成员变量,但不包含声明方法中局部变量。... Main.class 字节文件,字段表信息如下所示。...locals 为局部变量所需要存储空间,单位为槽(slot),方法参数变量和方法内局部变量都会存储局部变量。 args_size 为方法参数个数。...为什么 stack 值为 2,locals 值为 1,args_size 值为 1 呢? 默认构造方法不是没有参数和局部变量吗?...1,方法参数个数为 1,是因为局部变量只有一个隐藏 this,并且字节指令只执行了一次 aload_0。

27820

从精准化测试看ASMAndroid强势插入-字节

,常量池本质上就是一个数组存储了类中出现所有数值、字符串和类型常量,这些常量仅需要在这个常量池部分定义一次,就可以利用其索引,类文件所有其他各部分进行引用 字节执行过程 字节Java虚拟机是以堆栈方式进行运算...类型描述符 我们Java代码类型,字节,有相应表示协议。...我们来看下这段简单代码,字节下是怎样。...❝对于Java源文件:如果只有一个方法,编译生成时,也会有两个方法,其中一个是默认构造函数对于Kotlin源文件:如果只有一个方法,编译生成时,会产生四个方法,一个是默认构造函数,还有两个是kotlin...默认构造函数。 ? image-20210623105109646 onCreate: ?

66671

内部类只能访问final局部变量_java内部类引用外部变量

因为JDK8之前,如果我们匿名内部类需要访问局部变量,那么这个局部变量必须用final修饰符修饰。这里所说匿名内部类指的是在外部类成员方法定义内部类。...既然是方法创建内部类,必然会在某些业务逻辑中出现访问这个方法局部变量需求。那么我们下面就会研究这种情况。 为什么java语法要求我们需要用final修饰呢?...想了想没有什么答案,那我们就通过jd-gui反编译工具一探究竟,我们对匿名内部类字节文件进行反编译得到以下内容。...我们可以看到匿名内部类构造传入了一个参数,我们可以推理出这个参数就是底层传入str值,但因为反编译工具某种疏忽将构造方法体写成了空,事实上真正反编译代码应该是下面: public class...,是因为底层将这个局部变量值传入到了匿名内部类,并且以匿名内部类成员变量形式存在,这个值传递过程是通过匿名内部类构造器完成

90920

细微之处见真章之StringUtilsisBlank函数细节解读

另外我们研究这个问题时候又有了新发现: 我们发现 overlay 函数在此次提交时,将 StringBuilder 拼接字符串方式改为了直接用加号拼接,大家可以思考下为什么。...因此可以得出一个结论,两种写法编译后字节相同。 都是通过 ifne 判断上面表达式boolean 结果来决定执行再次循环或者返回逻辑。...2 局部变量声明时如果没有初始化,如果满足以下几种情况,则为 effectively final 没有声明为 final 当它出现在赋值表达式左边时,它肯定是未赋值,而且赋值之前也没有明确赋值...从语言角度: 只要满足以上条件,参数上可以不显式声明 final, 也可以 lambda 表达式或者匿名内部类中使用。 显式声明还有一个好处是,函数内部引用不能发生改变。...通过反编译可以破解一些语法糖,通过反汇编可以从字节层面学习知识。可以透过源码看到更本质东西,推荐大家去重点掌握。 细微之处见真章。

62220

Java 10 新特性解读

 场景一: 类实例化时 作为 Java开发者,声明一个变量时,我们总是习惯了敲打两次变量类型,第 一次用于声明变量类型,第二次用于构造器。...工作原理  处理 var时,编译器先是查看表达式右边部分,并根据右边变量值类型进行 推断,作为左边变量类型,然后将该类型写入字节当中。... 这不是JavaScript 首先我要说明是,var并不会改变Java是一门静态类型语言事实。编译器负责推 断出类型,并把结果写入字节文件,就好像是开发人员自己敲入类型一样。...下面是使用 IntelliJ(实际上是 Fernflower反编译器)反编译反编译代码: 从代码来看,就好像之前已经声明了这些类型一样。...null 方法引用  Lambda表达式  为数组静态初始化   不适用以下结构 :  情况1:没有初始化局部变量声明  情况2:方法返回类型  情况3:方法参数类型 

15720

程序员进阶系列:年少不懂爱家家,懂了已是猿中人。

来查看 class 文件结构,并把字节指令集重定向输出到文件 iplus_javap.txt 。...javap -v IPlus.class >> iplus_javap.txt javap 是 Java class 文件分解器,可以反编译,也可以查看 java 编译器生成字节,用于分解 class... JVM 规范定义了很多常量类型,汇总本次遇到几个。 ?...思考一:通过这段字节信息,印证了一个准则:没有显示声明构造情形下,Java 会默认提供无参构造方法。 思考二:虽然是无参构造器,为什么 args_size 值是 1 呢?...3 解剖:字节指令看看 i++ 执行 为了便于理解,把本次用字节指令先列一下,大家结合着去读。 ? 重点关注 main 方法的如下指令(红色圈住部分) ?

30730

反编译深入理解JAVA内部类类结构以及final关键字

下面通过反编译字节文件看看究竟。...事实上,编译器进行编译时候,会将成员内部类单独编译成一个字节文件,下面是Outter.java代码:      public class Outter {     private Inner inner...将这段代码字节反编译可以得到下面的内容:     我们看到run方法中有一条指令:    bipush 10    这条指令表示将操作数10压栈,表示使用是一个本地局部变量。...这个过程是在编译期间由编译器默认进行,如果这个变量值在编译期间可以确定,则编译器默认会在匿名内部类(局部内部类)常量池中添加一个内容相等字面量或直接将相应字节嵌入到执行字节。...从上面可以看出,run方法访问变量a根本就不是test方法局部变量a。这样一来就解决了前面所说 生命周期不一致问题。

51500

了解一下Java字节

此方法与源代码每个构造方法相对应,如果类没有明确地声明任何构造方法,编译器则为该类生成一个默认无参构造方法,这个默认构造器仅仅调用父类无参构造器,与此同时也会生成一个与默认构造方法对应 "(...添加一个无参数构造函数,再重新看看生成常量池。...前面分析Class结构时候,属性Code,有字节具体值。...当一个方法刚刚开始执行时候,这个方法操作数栈是空方法执行过程会有各种字节指令往操作数栈写入和提取内容,也就是出栈/入栈操作。...第一种方式是执行引擎遇到任意一个方法返回字节指令,这时候可能会有返回值传递给上层方法调用者;另外一种退出方式是,方法执行过程遇到了异常被抛出,就会导致方法退出,这时不会给它上层调用者产生任何返回值

1.4K30

深入EVM-合约分类这件小事背后风险

这也是为什么我们之前分析NFT时候,特地提及标准中会有一类SafeTransferFrom方法,其中Safe就是指代了采用165标准判断出对方声明自己具备了NFT转移能力。...反编译则是将获取到字节转到操作过程,更高级反编译则是再转成伪代码,更利于人阅读,这次我们用不上,反编译方法列于文末附录。...进行反编译后,则会得到如下操作串,可以说分两个部分 第一部分: 在编译器合约函数选择器部分会去获取到callData内容,寓意是获取其CallData函数调用签名,注释如下图。...,它规定了下一个执行命令字节位置。...合约在EVM运行原理会有以下特征 采用REVERT+JUMPDEST这2个连续 opcode 作为代码块区分 合约必然具备函数选择器功能,该功能也必然第一个代码块上 函数选择器,其函数方法均采用

25320

———反编译分析单例枚举类

JVM,这句语句至少做了3件事 1.给Singleton实例分配内存空间; 2.调用Singleton()构造函数,初始化成员字段; 3.将singleton指向分配内存空间(此时singleton...即使构造函数是私有的,反序列化时依然可以通过特殊途径去创建类一个新实例,相当于调用该类构造函数。...实例化过程发生在最后空static代码块,可以通过javap其他参数进一步分析static里面的字节内容,static里面其实包含了很多字节指令,这些指令在做枚举项INSTANCE初始化工作...来看看更详细,-c来看每个方法字节,-v把常量池信息也打印出来,这里了解即可,看不懂就看我上面的结论吧,重点只需要看static代码块部分字节,下面是为结论做一个验证。...多方面就涉及JVM很多内容了,和本文主题无关,后续会另开一篇讲字节指令。这里大家主要看static代码块中有哪些指令,明白枚举为什么会线程安全即可。 ----

59510

JVM内存与垃圾回收篇第5章虚拟机栈

运行原理 JVM直接对Java栈操作只有两个,就是对栈帧压栈和出栈,遵循先进后出(后进先出)原则 一条活动线程,一个时间点上,只会有一个活动栈帧。...) 操作数栈,也可以称之为表达式栈(Expression Stack) 操作数栈,方法执行过程,根据字节指令,往栈写入数据或提取数据,即入栈(push)和 出栈(pop) 某些字节指令将值压入操作数栈...操作数栈中元素数据类型必须与字节指令序列严格匹配,这由编译器在编译器期间进行验证,同时类加载过程类检验阶段数据流分析阶段要再次验证。...关于 int j = 8; 说明 我们反编译得到字节指令如下 因为 8 可以存放在 byte 类型,所以压入操作数栈类型为 byte ,而不是 int ,所以执行字节指令为...; //invokevirtual //虽然字节指令显示为invokevirtual,但因为此方法声明有final,不能被子类重写,所以也认为此方法是非虚方法。

40120

夯实Java基础系列18:深入理解Java内部类及其实现原理

通过反编译内部类字节,分析之后主要是通过以下几步做到: 1 编译器自动为内部类添加一个成员变量, 这个成员变量类型和外部类类型相同, 这个成员变量就是指向外部类对象引用; 2 编译器自动为内部类构造方法添加一个参数..., 参数类型是外部类类型, 构造方法内部使用这个参数为1添加成员变量赋值; 3 调用内部类构造函数初始化内部类对象时, 会默认传入外部类引用。...静态构造块、静态类属性按出现在类定义里面的先后顺序初始化,同理非静态也是一样,只是静态加载字节时执行一次,不管你new多少次,非静态会在new多少次就执行多少次 规律三、java类只有在被用到时候才会被加载...规律四、java类只有字节被加载后才可以被构造成对象实例 成员内部类 方法定义内部类称为局部内部类。...可以看到,内部类其实拥有外部类一个引用,构造函数中将外部类引用传递进来。 匿名内部类为什么只能访问局部final变量?

40910

夯实Java基础系列18:深入理解Java内部类及其实现原理

通过反编译内部类字节,分析之后主要是通过以下几步做到:   1 编译器自动为内部类添加一个成员变量, 这个成员变量类型和外部类类型相同, 这个成员变量就是指向外部类对象引用;   2 编译器自动为内部类构造方法添加一个参数..., 参数类型是外部类类型, 构造方法内部使用这个参数为1添加成员变量赋值;   3 调用内部类构造函数初始化内部类对象时, 会默认传入外部类引用。...静态构造块、静态类属性按出现在类定义里面的先后顺序初始化,同理非静态也是一样,只是静态加载字节时执行一次,不管你new多少次,非静态会在new多少次就执行多少次规律三、java类只有在被用到时候才会被加载规律四...、java类只有字节被加载后才可以被构造成对象实例 成员内部类 方法定义内部类称为局部内部类。...编译后得到Main.class Main$Inner.class两个文件,反编译Main$Inner.class文件如下: [Java 内部类] 可以看到,内部类其实拥有外部类一个引用,构造函数中将外部类引用传递进来

1.2K10
领券