给访问私有变量添加access method
class TestAccessPrivateVar{ private int a = 1; class MyInner{ /* synthetic final TestAccessPrivateVar this$0 <init>(synthetic final TestAccessPrivateVar this$0) { this.this$0 = this$0; super(); } */ public void t(){ int b = a; // int b = TestAccessPrivateVar.access$000(this$0); a++; // TestAccessPrivateVar.access$008(this$0) a += 1; // TestAccessPrivateVar.access$012(this$0, 1); } } /* synthetic static int access$000(TestAccessPrivateVar x0) { return x0.a; } synthetic static int access$008(TestAccessPrivateVar x0) { return x0.a++; } synthetic static int access$012(TestAccessPrivateVar x0, int x1) { return x0.a += x1; } */ }
class Outer { private Outer(){} /* synthetic <init>(com.test20.Outer$1 x0) { this(); } synthetic static class Outer$1 { } 要用这个新的类,因为怕与现有类冲突 */ class AOuter extends Outer{ // 将下面的构造函数更改为如下形式: /* synthetic final Outer this$0 public <init>(synthetic final Outer this$0) { this.this$0 = this$0 super(); } */ public AOuter(){ super(); // 将会更改为super(null)进行调用 } } }
package com.test19; public class TestProtectedVar { protected int a = 1; }
package com.test20; import com.test19.TestProtectedVar; class Parent extends TestProtectedVar{ public String method1() { return ""; } } class Sub extends Parent { public String method1() { return null; } class inner { public void t() { Sub.super.method1(); // Sub.access$001(this$0) Sub.this.method1(); // this$0.method1() int x = a; // int x = Sub.access$100(this$0) int y = Sub.super.a; // int y = Sub.access$201(this$0) } } /* synthetic static String access$001(Sub x0) { return x0.method1(); } synthetic static int access$100(Sub x0) { return x0.a; } // 下面的方法虽然与上面的body中代码一致,但是编号不一样 synthetic static int access$201(Sub x0) { return x0.a; } */ }
在内部类中获取外部类的私有变量,需要通过access method进行获取,举个例子,如下:
class TestAccessPrivateVar{ private int a = 1; class MyInner{ public void t(){ int b = a; // Test03.access$000(this$0) a += 1; // Test03.access$012(this$0, 1) } } }
通过在线工具http://www.javadecompilers.com/ 对class文件进行反编译后,结果如下:
package com.test19; class TestAccessPrivateVar { private int a = 1; TestAccessPrivateVar() { } static /* synthetic */ int access$000(TestAccessPrivateVar testAccessPrivateVar) { return testAccessPrivateVar.a; } static /* synthetic */ int access$012(TestAccessPrivateVar testAccessPrivateVar, int n) { return testAccessPrivateVar.a += n; } }
反编译内部类后的源代码如下:
package com.test19; class TestAccessPrivateVar$MyInner { /*synthetic*/ final Test07 this$0 TestAccessPrivateVar$MyInner(TestAccessPrivateVar var1) { this.this$0 = var1; } public void t() { int var1 = TestAccessPrivateVar.access$000(this.this$0); TestAccessPrivateVar.access$012(this.this$0, 1); } }
Classfile /C:/TestAccessPrivateVar.class Last modified 2018-7-26; size 534 bytes MD5 checksum db3dba90c37e7c304a98af3f9d4438b1 Compiled from "Test03.java" class com.test19.TestAccessPrivateVar SourceFile: "Test03.java" InnerClasses: #6= #5 of #3; //MyInner=class com/test19/TestAccessPrivateVar$MyInner of class com/test19/TestAccessPrivateVar minor version: 0 major version: 51 flags: ACC_SUPER Constant pool: #1 = Fieldref #3.#20 // com/test19/TestAccessPrivateVar.a:I #2 = Methodref #4.#21 // java/lang/Object."<init>":()V #3 = Class #22 // com/test19/TestAccessPrivateVar #4 = Class #23 // java/lang/Object #5 = Class #24 // com/test19/TestAccessPrivateVar$MyInner #6 = Utf8 MyInner #7 = Utf8 InnerClasses #8 = Utf8 a #9 = Utf8 I #10 = Utf8 <init> #11 = Utf8 ()V #12 = Utf8 Code #13 = Utf8 LineNumberTable #14 = Utf8 access$000 #15 = Utf8 (Lcom/test19/TestAccessPrivateVar;)I #16 = Utf8 access$012 #17 = Utf8 (Lcom/test19/TestAccessPrivateVar;I)I #18 = Utf8 SourceFile #19 = Utf8 Test03.java #20 = NameAndType #8:#9 // a:I #21 = NameAndType #10:#11 // "<init>":()V #22 = Utf8 com/test19/TestAccessPrivateVar #23 = Utf8 java/lang/Object #24 = Utf8 com/test19/TestAccessPrivateVar$MyInner { com.test19.TestAccessPrivateVar(); flags: Code: stack=2, locals=1, args_size=1 0: aload_0 1: invokespecial #2 // Method java/lang/Object."<init>":()V 4: aload_0 5: iconst_1 6: putfield #1 // Field a:I 9: return LineNumberTable: line 4: 0 line 5: 4 line 6: 9 static int access$000(com.test19.TestAccessPrivateVar); flags: ACC_STATIC, ACC_SYNTHETIC Code: stack=1, locals=1, args_size=1 0: aload_0 1: getfield #1 // Field a:I 4: ireturn LineNumberTable: line 4: 0 static int access$012(com.test19.TestAccessPrivateVar, int); flags: ACC_STATIC, ACC_SYNTHETIC Code: stack=3, locals=2, args_size=2 0: aload_0 1: dup 2: getfield #1 // Field a:I 5: iload_1 6: iadd 7: dup_x1 8: putfield #1 // Field a:I 11: ireturn LineNumberTable: line 4: 0 }
Classfile /C:/TestAccessPrivateVar$MyInner.class Last modified 2018-7-26; size 597 bytes MD5 checksum faad0d2e11456029c49b2a821e94c67d Compiled from "Test03.java" class com.test19.TestAccessPrivateVar$MyInner SourceFile: "Test03.java" InnerClasses: #23= #5 of #19; //MyInner=class com/test19/TestAccessPrivateVar$MyInner of class com/test19/TestAccessPrivateVar minor version: 0 major version: 51 flags: ACC_SUPER Constant pool: #1 = Fieldref #5.#17 // com/test19/TestAccessPrivateVar$MyInner.this$0:Lcom/test19/TestAccessPrivateVar; #2 = Methodref #6.#18 // java/lang/Object."<init>":()V #3 = Methodref #19.#20 // com/test19/TestAccessPrivateVar.access$000:(Lcom/test19/TestAccessPrivateVar;)I #4 = Methodref #19.#21 // com/test19/TestAccessPrivateVar.access$012:(Lcom/test19/TestAccessPrivateVar;I)I #5 = Class #22 // com/test19/TestAccessPrivateVar$MyInner #6 = Class #25 // java/lang/Object #7 = Utf8 this$0 #8 = Utf8 Lcom/test19/TestAccessPrivateVar; #9 = Utf8 <init> #10 = Utf8 (Lcom/test19/TestAccessPrivateVar;)V #11 = Utf8 Code #12 = Utf8 LineNumberTable #13 = Utf8 t #14 = Utf8 ()V #15 = Utf8 SourceFile #16 = Utf8 Test03.java #17 = NameAndType #7:#8 // this$0:Lcom/test19/TestAccessPrivateVar; #18 = NameAndType #9:#14 // "<init>":()V #19 = Class #26 // com/test19/TestAccessPrivateVar #20 = NameAndType #27:#28 // access$000:(Lcom/test19/TestAccessPrivateVar;)I #21 = NameAndType #29:#30 // access$012:(Lcom/test19/TestAccessPrivateVar;I)I #22 = Utf8 com/test19/TestAccessPrivateVar$MyInner #23 = Utf8 MyInner #24 = Utf8 InnerClasses #25 = Utf8 java/lang/Object #26 = Utf8 com/test19/TestAccessPrivateVar #27 = Utf8 access$000 #28 = Utf8 (Lcom/test19/TestAccessPrivateVar;)I #29 = Utf8 access$012 #30 = Utf8 (Lcom/test19/TestAccessPrivateVar;I)I { final com.test19.TestAccessPrivateVar this$0; flags: ACC_FINAL, ACC_SYNTHETIC com.test19.TestAccessPrivateVar$MyInner(com.test19.TestAccessPrivateVar); flags: Code: stack=2, locals=2, args_size=2 0: aload_0 1: aload_1 2: putfield #1 // Field this$0:Lcom/test19/TestAccessPrivateVar; 5: aload_0 6: invokespecial #2 // Method java/lang/Object."<init>":()V 9: return LineNumberTable: line 6: 0 public void t(); flags: ACC_PUBLIC Code: stack=2, locals=2, args_size=1 0: aload_0 1: getfield #1 // Field this$0:Lcom/test19/TestAccessPrivateVar; 4: invokestatic #3 // Method com/test19/TestAccessPrivateVar.access$000:(Lcom/test19/TestAccessPrivateVar;)I 7: istore_1 8: aload_0 9: getfield #1 // Field this$0:Lcom/test19/TestAccessPrivateVar; 12: iconst_1 13: invokestatic #4 // Method com/test19/TestAccessPrivateVar.access$012:(Lcom/test19/TestAccessPrivateVar;I)I 16: pop 17: return LineNumberTable: line 8: 0 line 9: 8 line 10: 17 }
给访问私有变量添加access method的更多相关文章
- 反射工具类.提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,被AOP过的真实类等工具函数.java
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; import org.ap ...
- Python访问私有变量
代码: class Counter(object): __secount=0 publicfs=0 def getcount(self): self.__secount+=1 self.publicf ...
- .net 反射访问私有变量和私有方法 如何创建C# Closure ? C# 批量生成随机密码,必须包含数字和字母,并用加密算法加密 C#中的foreach和yield 数组为什么可以使用linq查询 C#中的 具名参数 和 可选参数 显示实现接口 异步CTP(Async CTP)为什么那样工作? C#多线程基础,适合新手了解 C#加快Bitmap的访问速度 C#实现对图片文件的压
以下为本次实践代码: using System; using System.Collections.Generic; using System.ComponentModel; using System ...
- .net 反射访问私有变量和私有方法
以下为本次实践代码: using System; using System.Collections.Generic; using System.ComponentModel; using System ...
- C++怎么访问私有变量和函数
用指针呀,了解C++内存结构的话. 1. 对于私有成员变量,可以用指针来访问. 2. 对于虚函数,也可以用指针来访问. 3. 另外,对于私有成员,如果摸不准地址构造,可以先构造一个结构相似的类,然后增 ...
- 关于 私有变量的访问问题【 java python]
#coding:utf-8 class Teacher(): __clas = '' # 类私有变量同样遵循,只能在类内部访问,外部无法访问,但是类的方法可以访问同类所有对象私有变量这个规则. def ...
- JavaScript 执行环境(执行上下文) 变量对象 作用域链 上下文 块级作用域 私有变量和特权方法
总结自<高程三>第四章 理解Javascript_12_执行模型浅析 JS的执行环境与作用域 javascript高级程序第三版学习笔记[执行环境.作用域] 在javascript ...
- 第七章 函数表达式和函数声明,关于this对象 ,私有作用域(function(){})() ,私有变量和特权方法
一:函数表达式和函数声明 1:函数声明和函数表达式的区别 ①函数声明不需要分号结尾 ②函数声明有函数提升的特点 ③函数声明后面不能跟圆括号直接调用,因为javascript将function关键字当作 ...
- Javascript高级编程学习笔记(26)—— 函数表达式(4)私有变量
私有变量 严格来讲,JS中没有私有成员的概念,所有对象属性都是公有的. 但是JS中有私有变量的概念 所有在函数中定义的变量都可以认为是私有变量,因为不能在函数外部进行访问 私有变量包括 1.函数参数 ...
随机推荐
- (矩阵快速幂) Fibonacci -- poj -- 3070
链接: http://poj.org/problem?id=3070 Fibonacci Time Limit: 1000MS Memory Limit: 65536K Total Submi ...
- 201521123035-个人作业4——alpha阶段个人总结
个人总结 在alpha 结束之后, 每位同学写一篇个人博客, 总结自己的alpha 过程: 第一部分 类别 具体技能和面试问题 现在的回答(大三) 语言 最拿手的计算机语言是一?,代码量多少?(偏前端 ...
- linux处理U盘中的资料-挂载-tar.gz软件安装-linux环境下软件的安装方式
1. U盘插入linux一般会有以下反映 (1)/dev 的目录下,多出一个sdb的磁盘. 因为:目前系统中有两个硬盘, sda是原来的系统磁盘.sdb是插入的U盘. 其中:sdb1表示sdbU盘的一 ...
- IDEA14添加SVN
今天升级IDEA14,发现SVN变了,折腾了好一会才搞好.记录一下,希望其他人能少走弯路.主要是IDEA14的svn是用命令行工具进行操作,这样对以后SVN的兼容性也会好很多,这个在他们官方的博客上也 ...
- 查看Linux服务器被映射的公网ip
查看Linux服务器被映射的公网ip 现在云服务器非常流行,不仅企业甚至是个人都可能拥有自己的云服务器,但是目前的云服务器厂商提供的公网IP大都是映射而来,所以在Linux服务器上执行ifconf ...
- monoDB环境搭建
最近看到有部分人MongoDB安装之后总是启动不起来,在这里,写了一个简单的搭建教程 直接进入正题 1.mongoDB下载地址 https://www.mongodb.org/downloads#pr ...
- MongoDB VUE的下载及安装
下载: mongo vue官网地址:http://www.mongovue.com/ 安装: 很简单,注意的是:在提示buy 和 OK 的时候点击OK即可: 连接: 默认连接(无用户名密码): 在启 ...
- spring jdbc批量插入
http://blog.csdn.net/fyqcdbdx/article/details/7366439
- vhosetuser 和 vhostuservlient 差异
Open vSwitch支持的vHost-user类型 在Open vSwitch中vHost User通过socket进行通信,模式为client-server,其中server端负责创建/管理/销 ...
- 《Python黑帽子:黑客与渗透测试编程之道》 Web攻击
Web的套接字函数库:urllib2 一开始以urllib2.py命名脚本,在Sublime Text中运行会出错,纠错后发现是重名了,改过来就好: #!/usr/bin/python #coding ...