`

反编译出现access$分析

 
阅读更多

1)static Type access$iii(Outer); 是JAVA编译器自动生成的十分重要的方法(该方法的个数由你的内部类要访问的外部类的变量个数相关),目的是:用于内部类访问外部类的数据成员时使用.

2)因此:JAVA编译器在生成内部类的访问外部类的数据成员时,会自动生成代码来调用这个方法.
以你的代码为例:内部类Inner中的方法
public int getDate() { 
return xx; 

生成的代码如下:(经javap 处理后)

Java code
 
?
1
2
3
4
5
6
7
8
9
10
11
12
public int getDate();
  LineNumberTable:
   line 120
 
 
 
  Code:
   Stack=1, Locals=1, Args_size=1
   0:   aload_0
   1:   getfield        #1//Field this$0:LOuter;
   4:   invokestatic    #3//Method Outer.access$000:(LOuter;)I
   7:   ireturn


代码第4行:通过Outer.access$000(Outer o)来获取外部类对象o中的private型的数据成员(请注意:这可是从另外一个类中访问其它类的private型数据成员--不是通过反射技术)

3)进一步:
若外部类定义了两个private 数据成员如下:
private int xx=12;
private float yy=12.4f;
这两个数据成员在内部类中都要访问,则编译器会自动生成两个access方法:
static int access$000(Outer);  用于内部类访问private int xx;
static float access$100(Outer);  用于内部类访问private float yy;

4)这种内部类访问外部类中private数据成员的技术(不是通过反射!) 给安全留下了可能的小隐患(因为有些private数据成员是不提供外界访问它的所谓的getter()的).为此,编译器对自己自动生成的这些access$000()方法,在编译时进行检查,是不允许程序员直接来调用的.

但是:我们可以利用JAVA编译器对类的编译特性来绕过这个检查:目的是,达到在自己的其它类中直接来调用这些access$000()方法.
这样,我们可采用这个技术(即:在自己的类中--注意不是内部类,而是外部类中直接来调用这个access$000(Outer);)来访问其它类的private的数据成员了.

具体技术演示如下:
第一步:定义如下的类:
class Outer { 
private final int xx = 123;  
//由于是final,故不再自动生成access$000(Outer);

public Inner getInner() { 
return new Inner(); 

public class Inner { 
public int getDate() { 
return xx; 

} //class Inner

 static int access$000(Outer)//这个是自已定义的!
 {
  return  1;
 } 


第二步:定义你的其它类,来直接调用这个access$000()方法
public class Test1
{
 public static void main(String[] args)
 {

  System.out.println(Outer.access$000(new Outer()));  //这个调用是没有问题的,因为是自己定义的!
 }

}

将上述两个JAVA文件编译成class,成其是第二步的 Test1.class

第三步:这是变戏法的一步:
将第一步的类Outer改为如下:
class Outer { 
private  int xx = 123;  
//由于不是final,故自动生成access$000(Outer);

public Inner getInner() { 
return new Inner(); 

public class Inner { 
public int getDate() { 
return xx; 

} //class Inner
/*将这个第一步中自己定义的access$000去掉,因为编译器会自动生成它!
 static int access$000(Outer {
  return  1;
 } */

重新编译第三步中的这个类,而第二步中的类Test.class不动它. 此时,我们达到了这样一个目的:在类Test1中调用了Outer类中编译器自动生成的这个access$000(...)了.

分享到:
评论

相关推荐

    ASP.NET的网页代码模型及生命周期

    q 当一部分页面出现错误不会影响到其他的页面或功能。 q 不需要项目文件,可以把一个目录当作一个Web应用来处理。 总体来说,ASP.NET网站适用于较小的网站开发,因为其动态编译的特点,无需整站编译。而ASP.NET应用...

    精通SQL 结构化查询语言详解

    5.3.4 反向排序  5.4 使用WHERE子句定义搜索条件查询  5.4.1 WHERE子句单条件查询 5.4.2 单值比较运算符 5.4.3 BETWEEN运算符范围筛选 5.4.4 NULL值的判断 第6章 复杂搜索条件查询  6.1 本章用到的实例...

    2009.6.19—30举办3S研讨会暨Google Earth与Google Map等仿真建模与共享及ARCGIS与遥感高级程序员培训班

    10、ARCGIS高级分析功能操作应用:ArcGIS地统计分析模块应用、网络路径分析和矢量空间分析(网络追踪分析及市区选房分析为例)、空间校正、明暗等高线(以土壤项目数据为例)、噪声影响分布分析、专题图制作、三维...

    asp.net知识库

    Asp.net地址转义(分析)加强版 Web的桌面提醒(Popup) Using the Popup Object Click button only once in asp.net 2.0 Coalesys PanelBar + R.a.d Treeview +Xml 构建的Asp.net 菜单和权限管理模块 突破屏蔽限制...

    精通Odoo开发和使用

    2.1 python 模块分析 8 2.2 python2 还是 python3 8 3 Odoo 的安装和配置 9 3.1 PostgreSQL 数据库 10 3.2 Ubuntu14.04 下可能缺失的软件包 11 3.3 网页显示 node.js 方面 11 3.4 其他问题 12 3.5 通过命令行运行时...

    C#微软培训资料

    9.3 面向对象的分析 .105 9.4 面向对象的设计 .107 9.5 小 结 .110 第十章 类 .112 10.1 类 的 声 明 .112 10.2 类 的 成 员 .113 10.3 构造函数和析构函数 .119 10.4 小 结 .122 第十一章 方 法 ....

    精通SQL--结构化查询语言详解

    5.3.4 反向排序 92 5.4 使用where子句定义搜索条件查询 93 5.4.1 where子句单条件查询 93 5.4.2 单值比较运算符 94 5.4.3 between运算符范围筛选 96 5.4.4 null值的判断 97 第6章 复杂搜索条件查询 99 6.1 本...

    iWeb Office2000[C#版]

    3. 你不得对本程序进行修改或破解或反编译 4. 未经DBstep授权许可,你不得将本软件用于商业目的 5. [数据驿站,版权所有],http://www.dbstep.com 主要功能表 =========================================...

    iWeb Office2000[.NET版]

    3. 你不得对本程序进行修改或破解或反编译 4. 未经DBstep授权许可,你不得将本软件用于商业目的 5. [数据驿站,版权所有],http://www.dbstep.com 主要功能表 =========================================...

    iWeb Office2000[EXE版]

    3. 你不得对本程序进行修改或破解或反编译 4. 未经DBstep授权许可,你不得将本软件用于商业目的 5. [数据驿站,版权所有],http://www.dbstep.com 主要功能表 =========================================...

    iWeb Office2000[OCX版]

    3. 你不得对本程序进行修改或破解或反编译 4. 未经DBstep授权许可,你不得将本软件用于商业目的 5. [数据驿站,版权所有],http://www.dbstep.com 主要功能表 =========================================...

    iWeb Office2000[ASP版]

    3. 你不得对本程序进行修改或破解或反编译 4. 未经DBstep授权许可,你不得将本软件用于商业目的 5. [数据驿站,版权所有],http://www.dbstep.com 主要功能表 =========================================...

    单点登录源码

    - 统一下单(统一下单接口、统一扫码)、订单管理、数据分析、财务报表、商户管理、渠道管理、对账系统、系统监控。 ![统一扫码支付](project-bootstrap/zheng-pay.png) > zheng-ucenter 通用用户管理系统, 实现...

    《你必须知道的495个C语言问题》

    4.7 我有些解析外部结构的代码,但是它却崩溃了,显示出了“unaligned access”(未对齐的访问)的信息。这是什么意思? 47 作为函数参数的指针 47 4.8 我有个函数,它应该接受并初始化一个指针:void f(int *ip)...

    JAVA上百实例源码以及开源项目源代码

     Java编写的网页版魔方游戏,编译后生成.class文件,然后用HTML去调用,不过运行时候需要你的浏览器安装有运行Class的插件。Java源代码实现部分,比较有意思,也具参考性。像坐标控制、旋转矩阵、定时器、生成图像...

    JAVA上百实例源码以及开源项目

     Java编写的网页版魔方游戏,编译后生成.class文件,然后用HTML去调用,不过运行时候需要你的浏览器安装有运行Class的插件。Java源代码实现部分,比较有意思,也具参考性。像坐标控制、旋转矩阵、定时器、生成图像...

    精易模块[源码] V5.15

    4、修正“IP_10进制转IP”与“IP_16进制转IP”命令反向的问题,感谢易友[@humanbean ]反馈。 5、改善“网页_访问”死循环代码,感谢易友[@67564226]反馈。 6、优化“文本_取随机数字”精简代码,提高执行效率,感谢...

Global site tag (gtag.js) - Google Analytics