给访问私有变量添加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.函数参数 ...
随机推荐
- Java火焰图在Netflix的实践
转自 http://www.infoq.com/cn/news/2015/08/java-flamegraph 亲爱的读者:我们最近添加了一些个人消息定制功能,您只需选择感兴趣的技术主题,即可获取重要 ...
- CDialog
对话框和对话框类CDialog 对话框经常被使用,因为对话框可以从模板创建,而对话框模板是可以使用资源编辑器方便地进行编辑的. 模式和无模式对话框 对话框分两种类型,模式对话框和无模式对话框. 模式对 ...
- Eclipse ADT 与VS 常用的快捷键 对比学习
注:以下说的类型于VS,是指:VS+Resharper的快捷键,我是采用了Resharper作为VS的快捷键. 导航 Ctrl+1 快速修复 (类似于VS的alt+enter) Ctrl+D: 删除当 ...
- 设计模式之迭代器模式(Iterator Pattern)
一.什么是迭代器模式? 用迭代器来封装集合对象的遍历细节,使调用者能够通过统一的接口来实现对集合的遍历 迭代器也给集合对象提供了一定的保护,想要遍历集合,直接调用迭代器的方法就好了,我们不知道也不必知 ...
- qt中多线程用法总结
1.多线程的理解 在操作系统中线程和进程划分. 操作系统可以同时执行多个任务,每个任务就是进程:进程可以同时执行多个任务,每个任务就是线程. 线程之间相互独立,抢占式执行.对于单核CPU来说同一时刻只 ...
- 记录.NET Core部署到Linux之发布项目到Linux(2)
1.选择文件夹发布项目到本地,通过Xftp上传文件到/home/wwwroot下:下面具体介绍下 2.通过Xftp直接拖拽压缩包到linux下,通过命令cd /home/wwwroot目录下;然后输入 ...
- redis的常用公共方法(2)
之前已经写过一篇redis公共方法的使用(https://www.cnblogs.com/jhy55/p/7681626.html),可是发现在高并发的时候出现 Unknown reply on in ...
- 使用pipreqs生成项目依赖
作用 导出当前项目的环境依赖 使用 # 安装 pip3 install pipreqs # 导出项目环境依赖 pipreqs ./ # 如果是Windows系统,会报编码错误 (UnicodeDeco ...
- 网络请求 get 请求时, 如果参数中的字符带有+号
网络请求 get 请求时, 如果参数中的字符带有+号, 今天前端在调用我的API时, 发现有个参数一直没法通过我后台的验证, 但是在前端查看时, 该参数结构又没有什么异常, 又是一番查找, 直到在后端 ...
- MySQL(分组、连表操作、备份数据库)
day58 分组 参考:https://www.cnblogs.com/xp796/p/5262187.html select dept, max(salary) from department gr ...