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的更多相关文章

  1. 反射工具类.提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,被AOP过的真实类等工具函数.java

    import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; import org.ap ...

  2. Python访问私有变量

    代码: class Counter(object): __secount=0 publicfs=0 def getcount(self): self.__secount+=1 self.publicf ...

  3. .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 ...

  4. .net 反射访问私有变量和私有方法

    以下为本次实践代码: using System; using System.Collections.Generic; using System.ComponentModel; using System ...

  5. C++怎么访问私有变量和函数

    用指针呀,了解C++内存结构的话. 1. 对于私有成员变量,可以用指针来访问. 2. 对于虚函数,也可以用指针来访问. 3. 另外,对于私有成员,如果摸不准地址构造,可以先构造一个结构相似的类,然后增 ...

  6. 关于 私有变量的访问问题【 java python]

    #coding:utf-8 class Teacher(): __clas = '' # 类私有变量同样遵循,只能在类内部访问,外部无法访问,但是类的方法可以访问同类所有对象私有变量这个规则. def ...

  7. JavaScript 执行环境(执行上下文) 变量对象 作用域链 上下文 块级作用域 私有变量和特权方法

    总结自<高程三>第四章  理解Javascript_12_执行模型浅析   JS的执行环境与作用域  javascript高级程序第三版学习笔记[执行环境.作用域] 在javascript ...

  8. 第七章 函数表达式和函数声明,关于this对象 ,私有作用域(function(){})() ,私有变量和特权方法

    一:函数表达式和函数声明 1:函数声明和函数表达式的区别 ①函数声明不需要分号结尾 ②函数声明有函数提升的特点 ③函数声明后面不能跟圆括号直接调用,因为javascript将function关键字当作 ...

  9. Javascript高级编程学习笔记(26)—— 函数表达式(4)私有变量

    私有变量 严格来讲,JS中没有私有成员的概念,所有对象属性都是公有的. 但是JS中有私有变量的概念 所有在函数中定义的变量都可以认为是私有变量,因为不能在函数外部进行访问 私有变量包括 1.函数参数 ...

随机推荐

  1. node nodemailer

    需求:通过nodejs发送邮件 一般都是用nodemailer这个模块.目前有0.7和1.0两个版本,网上的很多教程和代码,大都是按照0.7写的,自己做的时候需要注意看README.md 支持的ser ...

  2. 哈希连接(hash join) 原理

    哈希连接(hashjoin)    访问次数:驱动表和被驱动表都只会访问0次或1次.    驱动表是否有顺序:有.    是否要排序:否.    应用场景: 1. 一个大表,一个小表的关联:     ...

  3. Delphi XE7 用indy开发微信公众平台所有功能,可刷阅读,可刷赞,可加推广(除微支付)

    http://www.cnblogs.com/devinlee/p/4565933.html Delphi XE7 用indy开发微信公众平台所有功能,可刷阅读,可刷赞,可加推广(除微支付) 关注作者 ...

  4. Jersey Client Post Bean参数

    代码: public static void main(String[] args) { Student st = new Student("Adriana", "Bar ...

  5. Mina Session

    Chapter 4 - Session The Session is at the heart of MINA : every time a client connects to the server ...

  6. 【转一篇出处不明的文章】 Windows多线程通信方式

    多线程通信的方法主要有以下三种: 1.全局变量 进程中的线程间内存共享,这是比较常用的通信方式和交互方式.注:定义全局变量时最好使用volatile来定义,以防编译器对此变量进行优化. 2.Messa ...

  7. subprocess.Popen 运行windows命令出现“句柄无效”报错的解决方法

    在框架开发中遇到 subprocess执行多了,就会好句柄无效的问题,终于找到解决方案:如下,修改subprocess中的一点代码就好,也不知道这是不是Python 的bug因为,Python27时没 ...

  8. VS未能正确加载 ”Microsoft.VisualStudio.Editor.Implementation.EditorPackate“包错误解决方法

    很久没用VS了,打开后出现未能正确加载 ”Microsoft.VisualStudio.Editor.Implementation.EditorPackate“包的错误,经过一番上网查阅错误得以解决. ...

  9. JavaScript编程题(含腾讯2016校招题)

    作者:ManfredHu 链接:http://www.manfredhu.com/2016/04/02/15-veryGoodForUsing/ 声明:版权所有,转载请保留本段信息,否则请不要转载 几 ...

  10. super函数的用法

    1.创建一个类. # .创建一个类 class Bird: def __init__(self): self.hungry =True def eat(self): if self.hungry: p ...